Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用constexpr函数作为模板参数是否有效? constexpr int get(){return 5;} 模板结构测试{}; int main() { int a[get()];//确定 Testobj;//错误:“int get()”不能出现在常量表达式中 }_C++_Templates_C++11_Compiler Errors_Constexpr - Fatal编程技术网

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
}