関数(またはコンストラクタ)のためだけに...
- constexpr と宣言され、
- 関数定義は constexpr 要件を満たしています
...コンパイラが変換中に constexpr 関数を評価するという意味ではありません。C++11 FDIS (N3242、http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/ で入手可能) を調べて、次の 2 つのことを試してみました。
- 翻訳中にコンパイラが constexpr 関数を評価する義務があるのはいつですか?
- 翻訳中にコンパイラが constexpr 関数を評価できるのはいつですか?
セクション 5.19 パラグラフ 1 は、変換中に定数式を評価できると述べています。私が理解できる限り、セクション 5.19 の残りの部分では、constexpr 関数の定義で何が有効かについてのルールを説明しています。
constexpr 関数の結果を constexpr として宣言することで、翻訳中に constexpr の評価を強制できることを理解しています。このような:
// Declaration
constexpr double eulers_num() { return 2.718281828459045235360287471; }
// Forced evaluation during translation
constexpr double twoEulers = eulers_num() * 2.0;
static_assert(twoEulers > 5.0, "Yipes!");
これまでのところ、FDIS で次の段落を見つけることができませんでした。
twoEulers
翻訳中に評価される力または- コンパイラが変換中に constexpr 関数を評価する場合、または評価する必要がある場合のその他の状況を指定します。
私が特に興味を持っているのは、翻訳中の constexpr 評価が以下によってトリガーされるかどうかです。
- constexpr 関数に渡されるすべてのパラメーターがリテラルの場合、または
- オーバーロード解決中の暗黙のオブジェクト引数(セクション 13.3.1 パラグラフ 3) は、constexpr であるか、リテラル (配列次元など) を必要とするか、または
- まったく別の何か。
可能であれば、回答の中で、私が調べられる FDIS のセクションまたは FDIS で検索できるキー フレーズを引用してください。標準の英語はやや鈍いので、関連する段落を読んでいて、その意味や意図を完全に見逃している可能性があります。