2016-06-11 9 views
1

constexpr関数は定数式です。インライン関数は、静的な値の初期化中に定数式と見なされますか?インライン関数による静的な値の初期化は定数式で初期化されていますか?

constexpr int constexpr_add_one(int x) { return x + 1; } // implies inline 
inline int inline_add_one(int x) { return x + 1; } 

static const int constexpr_value = constexpr_add_one(0xaaaa0000); 
static const int inline_value = inline_add_one(0xbbbb0000); 

// Aside: 
// static constexpr int another_constexpr_value = constexpr_add_one(0xcccc0000); 
// error: call to non-constexpr function ‘int inline_add_one(int)’ 
// static constexpr int another_inline_value = inline_add_one(0xdddd0000); 

volatile int value; 

int main() { 
    value = constexpr_value; 
    value = inline_value; 
} 

C++標準では、「定数式」(「夜は 'constexpr'なし)の定義を提供していますか?

は、私は約constexprないinline機能を話しているstatic値の初期化のためのG ++ 4.8.4

+0

をどうなりますか? –

+0

@RichardCrittenインラインの場合のエラーです。 –

+0

はありません、非常に最小限のアセンブリを生成するために重い最適化の多くを行うことができます。この例コンパイラであってもよいが、constexpr_one'だけで、コンパイル時に直接計算値(だろう 'に対し、デバッグビルドでは、' inline_one'は、通常のコールのセマンティクスを持っているでしょう)割り当て。 – Arunmu

答えて

1

ルールを使用しています。

constexprは、inlineを意味するが、inlineは、constexprを意味しない。関数の規則のいずれかを選択して、下にあるconstexprにして、関数がそれを中断させるようにしてください。このような機能は、まだinlineにできます。関数宣言に使用

http://en.cppreference.com/w/cpp/language/constexpr

constexprの指定子は、インラインことを意味します。

constexprの機能は、次の要件満たさなければならない:それは、仮想であってはならない

  • その戻り型は、そのパラメータの各々が少なくとも存在LiteralType
  • なければならないLiteralType
  • なければなりません関数の呼び出しがコア定数の評価された部分式になるような1つの引数値 式(constexpr関数テンプレートの場合、少なくとも1つ 特殊化m UST()定数イニシャライザに を使用し、コンストラクタのために、この要件を満たすのに十分であるC++ 14))
  • 機能本体が削除またはデフォルトまたは含有しなければならないのいずれかでのみ以下になったのは:
    • ヌル文
    • static_assert宣言ディレクティブ
    • を使用して宣言
    • を使用してクラスまたは列挙
    • を定義しない
    • のtypedef宣言とエイリアス宣言
    • 正確に1つのreturn文。(までC++ 14)を除く
  • 関数本体を削除または不履行または任意のステートメントが含まれている必要があり、次のいずれかのラベルを持つ
    • のasm宣言
    • goto文
    • 声明場合、デフォルト以外の
    • のtryブロック
    • 非リテラルタイプ
    • definの変数の定義静的またはスレッド記憶期間の変数の値
    • 初期化が実行されない変数の定義。
    • 機能がデフォルトで設定コピー/移動の割り当てであれば、それがメンバーとなっているクラスは、あなたが 任意の賢明な方法 inlineconstexpr間違いなく非ある関数を作ることができる可変バリアントメンバーを持つことはできません。

イー・G。 パラメータではないリテラル

inline void f1(const std::string&) { } 

非リテラルタイプ

inline void f1() { std::string a; } 

のtryブロックの変数の定義

inline void f1() { try { int a = 0; } catch(...) {} } 

EDIT: 標準は "定数式" を定義しません。定義はかなり長いです。 `静的constexprののint`:たぶん、あなたはここでそれを確認することができます:あなたは、値の宣言を変更した場合 http://en.cppreference.com/w/cpp/language/constant_expression

+0

"constexpr"ではなく、 "オブジェクトoの定数初期化子は**定数式**、[...]"の式です –

+0

Ok。私の印象は、可能なすべての定数式から、あなたはconstexprだけに興味があるということでした。静的関数呼び出しの結果が常に定数式であるとは限りません。 http://en.cppreference.com/w/cpp/language/constant_expression –

+0

あなたは暗闇の中でただ撃っているだけなので、非常に便利な答えではありません。 –

関連する問題