为什么 gcc5.4 不编译调用非 constexpr 函数的 constexpr 函数,而 icpc 编译呢?
Why gcc5.4 doesn't compile a constexpr function calling a non-constexpr function, but icpc does?
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(Intel 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
第一个限制是关于将 gcc 5.4 与 -std=c++11 一起使用会产生错误,因为两个 return 语句见 所以为了解除你的第一个问题你需要使用 -std=c++14
然后生成
'#1 with x86-64 gcc 5.4
: In function 'constexpr int func(int)':
:10:32: error: call to non-constexpr function 'int
nonconstexprfunc()'
return nonconstexprfunc(); ^
: In function 'int main()':
:16:28: error: 'constexpr int func(int)' called in a constant
expression
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
您也可以查看
但是从它产生的错误来看:
做
似乎很明显
constexpr int nonconstexprfunc()
{
return 14;
}
将解决该错误并且在您的情况下会更有效率。
例如,检查 https://www.godbolt.org/ 添加 constexpr 或不使用 gcc 8.2 的区别。
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(Intel 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
第一个限制是关于将 gcc 5.4 与 -std=c++11 一起使用会产生错误,因为两个 return 语句见
然后生成
'#1 with x86-64 gcc 5.4 : In function 'constexpr int func(int)':
:10:32: error: call to non-constexpr function 'int nonconstexprfunc()'
return nonconstexprfunc(); ^
: In function 'int main()':
:16:28: error: 'constexpr int func(int)' called in a constant expression
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
您也可以查看
但是从它产生的错误来看:
做
似乎很明显constexpr int nonconstexprfunc()
{
return 14;
}
将解决该错误并且在您的情况下会更有效率。
例如,检查 https://www.godbolt.org/ 添加 constexpr 或不使用 gcc 8.2 的区别。