C++ 使用constexpr函数作为模板参数是否有效? constexpr int get(){return 5;} 模板结构测试{}; int main() { int a[get()];//确定 Testobj;//错误:“int get()”不能出现在常量表达式中 }
我有。我想知道为什么会出现编译错误。C++ 使用constexpr函数作为模板参数是否有效? constexpr int get(){return 5;} 模板结构测试{}; int main() { int a[get()];//确定 Testobj;//错误:“int get()”不能出现在常量表达式中 },c++,templates,c++11,compiler-errors,constexpr,C++,Templates,C++11,Compiler Errors,Constexpr,我有。我想知道为什么会出现编译错误。 constexpr函数不允许作为template参数使用,还是编译器中存在错误 编辑:将const int get()更改为int get() 此外,ideone还有一个bug,如果您删除constexpr,那么!!我认为这是C99的一个特性。GCC4.5(至少是Ideone使用的版本)不完全支持constepr,包括您的有效用法;它向下延伸到一个常数。GCC 4.6和UP正确地支持它。您的编辑不正确,您使它成为代码> conxPR const gt()/c
constexpr
函数不允许作为template
参数使用,还是编译器中存在错误
编辑:将const int get()
更改为int get()
此外,ideone还有一个bug,如果您删除
constexpr
,那么!!我认为这是C99的一个特性。GCC4.5(至少是Ideone使用的版本)不完全支持constepr
,包括您的有效用法;它向下延伸到一个常数
。GCC 4.6和UP正确地支持它。您的编辑不正确,您使它成为代码> conxPR const gt()/c>。在编辑上,这是一个C99特性,GCC将它作为一个扩展,但它不是正确的C++,它将不是可移植的。它被考虑包含在标准中,但被拒绝了,因为它会打破编译时必须知道类型(大小是类型的一部分)的不变性。在C中,这并不重要,但是在C++中,您不能使用该数组作为模板的类型参数(在编译时未知的确切类型)——这是GCC中的行为,如果您尝试这样做,它会抱怨。
constexpr int get () { return 5; }
template<int N> struct Test {};
int main ()
{
int a[get()]; // ok
Test< get() > obj; // error:'int get()' cannot appear in a constant-expression
}