c++ - constexpr 是否暗示内联?

标签 c++ c++11 inline standards-compliance 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 说明符,因为如果将非常量参数传递给 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/

相关文章:

c++ - 声明 vector 的 protected 指针的问题

c++ - 内联和 dlimport/dllexport

c++ - 确定字节输入和显示值之间的未知关系

c++ - Switch case 语句如何在内部实现或工作?

c++ - 完成的线程对winapi中的主程序有影响吗?

c++ - 设置一个 C 风格的数组,模板函数接受回调

c++ - 简单乘法后得到错误的结果 - C++

c++ - C++中的双&和 move 函数

bash - bash shell 脚本中的 "set -o noglob"

c++ - gdb 自动进入内联函数