C 11 では Constexpr はインラインを意味しますか?
C 11 標準では constexpr 指定子が導入されており、これにより関数と変数を次の時点で評価できるようになります。コンパイル時間。これにより、constexpr と inline の関係について混乱が生じています。
inline 指定子は、関数のインライン展開を実行するようにコンパイラに指示します。これは、関数のコードが、間接的に呼び出される別の関数を作成するのではなく、関数が呼び出されるコードに直接挿入されることを意味します。
constexpr 指定子は、インライン指定子を明示的に意味しません。ただし、C 11 標準では、「constexpr 関数と constexpr コンストラクターは暗黙的にインラインである」(§7.1.5/2) と規定されています。
影響
これは、コンパイラは、constexpr 関数に対してもインライン関数の場合と同じルールに従う必要があります。特に、コンパイラは、関数が非定数引数で呼び出された場合でも、関数をインライン化することがあります。
例
次の例を考えてみましょう:
<code class="cpp">#include <iostream> #include <cstdlib> inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); }</code>
この例では、関数 f は、定数以外の引数を指定して呼び出されたにもかかわらず、インライン化されています。これは、 f 関数が inline として宣言されているためです。
結論
constexpr 指定子は、明示的に inline 指定子を意味しません。ただし、C 11 標準では、コンパイラが constexpr 関数がインライン関数であるかのように動作する必要があります。これは、コンパイラが、定数以外の引数を指定して呼び出された場合でも、constexpr 関数を安全にインライン化できることを意味します。
以上が`constexpr` は C 11 の `inline` を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。