我有一个函数,该函数获取指向C样式数组的指针。当我显式设置变量moment-holiday
的类型,然后使用Clang编译代码时,出现以下错误:
twoDArray
当我注释掉该行并使用注释掉的部分时,代码将正确编译。当我使用g ++编译代码时,两种变体都会被接受。
这是Clang编译器中的错误,还是g ++在这种情况下接受某些非标准代码?
main.cpp:8: error: variable-sized object may not be initialized
const T (&twoDArray)[dim1][dim2]{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};
答案 0 :(得分:2)
这是非标准的g ++扩展,允许g ++接受代码。 g ++允许您声明不属于C ++标准的VLA(可变长度数组)。要使此代码符合标准,您可以将dim1
和dim2
移到模板参数中,并将它们作为编译时间常数进行传递,例如:
template<size_t dim1, size_t dim2, typename T>
void printVector(const T *cVector)
{
const T (&twoDArray)[dim1][dim2]{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};
// auto twoDArray{*reinterpret_cast<const T (*)[dim1][dim2]>(cVector)};
std::cout << "Printing 2D array: " << std::endl;
for(int i = 0; i < dim1; i++) {
for (int j = 0; j < dim2; j++) {
std::cout << twoDArray[i][j] << " ";
}
std::cout << std::endl;
}
}
int main()
{
const size_t VEC_SIZE_CONST{2};
double cVector[VEC_SIZE_CONST][VEC_SIZE_CONST]{{1.1, 2.2}, {3.3, 4.4}};
printVector<VEC_SIZE_CONST, VEC_SIZE_CONST>(&cVector[0][0] );
return 0;
}