1. ホーム
  2. c++

[解決済み] constexprはinlineを意味するのか?

2022-07-07 22:28:36

質問

次のインライン関数を考えてみましょう。

// 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 指定子は実際には 非常に コンパイラが関数をインライン展開するかどうかには、ほとんど (もしあれば) 影響を与えません。しかし、これは 1 つの定義ルールに影響し、その観点から、コンパイラーは同じルールに従って constexpr 関数と inline 関数として使用することができます。

また constexpr を意味する inline のルールは constexpr 関数については、C++11 では、インライン展開に適していることが多いほど単純であることが要求されました(再帰的な関数は主な例外です)。しかし、それ以降、ルールは徐々に緩くなり、そのため constexpr は実質的により大きく、より複雑な関数に適用することができます。