为什么gcc5.4不编译调用非constexpr函数的constexpr函数,而icpc编译呢?

时间:2019-01-23 12:05:44

标签: c++ gcc constexpr icc

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

1 个答案:

答案 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:3​​2:错误:调用非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。