constexpr暗示内联?
考虑下面的内联函数:
// 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
说明符的意义上说,如果一个非常量parameter passing给constexpr
函数,编译器将尝试inline
函数,就好像inline
说明符被放在它的声明?
C ++ 11标准是否可以保证?
是(§7.1.5/ 2):“constexpr函数和constexpr构造函数隐式内联(7.1.2)”。
但是,请注意, inline
说明符对于编译器是否可能扩展内联函数的影响很小(如果有的话)。 但是,它会影响到一个定义规则,从这个angular度来看,编译器需要遵循与inline
函数相同的constexpr
函数规则。
我还要补充一点,不pipeconstexpr
意味着inline
, constexpr
函数的规则要求它们足够简单,以至于它们通常是内联扩展的好select(主要的例外是那些recursion的)。