gcc5.4无法编译以下代码:
// source.cpp
int nonconstexprfunc()
{
return 14;
}
constexpr int func(int n)
{
if (n < 0)
return nonconstexprfunc();
return n*n;
}
int main()
{
constexpr int t1 = func(0);
return 0;
}
我使用的命令:
$ g++ -std=c++14 -c source.cpp
输出:
In function ‘constexpr int func(int)’:
error: ‘constexpr int func(int)’ called in a constant expression
constexpr int t1 = func(0);
In function ‘int main()’:
error: ‘constexpr int func(int)’ called in a constant expression
constexpr int t1 = func(0);
但是我可以使用gcc6.4编译source.cpp。 gcc5.4不完全支持constexpr函数吗?
更有趣的是,我可以使用使用gcc5.4的icpc(英特尔C ++编译器)编译source.cpp-我想必须有一个使用gcc5.4编译该代码的选项。
$ icpc -v
icpc version 19.0 (gcc version 5.4.0 compatibility)
$ icpc -std=c++14 -c source.cpp
no errors
答案 0 :(得分:2)
第一个限制涉及与-std = c ++ 11一起使用gcc 5.4会由于两个return语句而产生错误,请参见The body of constexpr function not a return-statement,因此,要解除第一个问题,您需要使用-std = c ++ 14
然后产生
'#1与x86-64 gcc 5.4 :在函数'constexpr int func(int)'中:
:10:32:错误:调用非constexpr函数'int nonconstexprfunc()'
return nonconstexprfunc(); ^
:在函数'int main()'中:
:16:28:错误:在常量中调用了'constexpr int func(int)' 表达
constexpr int t1 = func(0); Compiler returned: 1
下一个产生的错误似乎是已知的GCC错误(对c ++ 14的误解),请参见
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86678
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67026
您还可以签出calling non constexpr function from constexpr allowed in some conditions
但是从错误中判断,它会产生:
这样做似乎很明显
constexpr int nonconstexprfunc()
{
return 14;
}
将解决该错误,并在您的情况下提高效率。
例如,使用https://www.godbolt.org/检查是否添加了constexpr,或者是否不使用gcc 8.2。