为什么 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 的区别。