考虑以下内联函数:
// 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 标准是否保证?
最佳答案
是([dcl.constexpr],C++11 标准中的 §7.1.5/2):“constexpr 函数和 constexpr 构造函数是隐式内联的 (7.1.2)。”
但是请注意,inline
说明符对于编译器是否可能内联扩展函数的影响确实非常很小(如果有的话)。然而,它确实会影响一个定义规则,从这个角度来看,编译器需要遵循与 constexpr
函数和 inline
函数相同的规则。
我还应该补充一点,无论 constexpr
是否暗示 inline
,C++11 中 constexpr
函数的规则都要求它们简单足以使它们通常是内联扩展的良好候选者(主要的异常(exception)是那些递归的)。然而,从那以后,规则变得越来越宽松,因此 constexpr
可以应用于更大、更复杂的函数。
关于c++ - constexpr 是否暗示内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391272/