是否constexpr暗示直列?(Does constexpr imply inline?)

2019-07-18 09:34发布

请看下面的内联函数:

// Inline specifier version
#include<iostream>
#include<cstdlib>

inline int f(const int x);

inline int f(const int x)
{
    return 2*x;
}

int main(int argc, char* argv[])
{
    return f(std::atoi(argv[1]));
}

和constexpr相当于版本:

// Constexpr specifier version
#include<iostream>
#include<cstdlib>

constexpr int f(const int x);

constexpr int f(const int x)
{
    return 2*x;
}

int main(int argc, char* argv[])
{
    return f(std::atoi(argv[1]));
}

我的问题是:在constexpr符意味着inline在这个意义上说明符,如果不恒定的参数传递给一个constexpr函数,编译器将尝试inline函数,就好像inline符放入其声明?

请问C ++ 11个标准保证?

Answer 1:

是([dcl.constexpr],在C ++ 11标准§7.1.5/ 2): “constexpr功能和constexpr构造是隐式直列(7.1.2)。”

但是请注意,该inline符真的有在编译器是否有可能扩大一个内联函数或不是很少 (如果有的话)的影响。 它,然而,影响一个定义规则,并从这个角度看,需要编译器遵循相同的规则为constexpr函数作为inline函数。

我还要补充一点,不管constexpr暗示inline ,对于规则constexpr在C ++ 11的功能要求他们足够简单,他们经常为内联扩展(主要例外是那些递归)很好的候选人。 此后,但是,规则已经逐渐变得较松,因此constexpr可以应用到基本上更大,更复杂的功能。



文章来源: Does constexpr imply inline?