GCC 4.7.2 はこれをコンパイルします。
constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
しかし、これではありません:
constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
C++11 §5.1.2/15 によると、後者の例は私には正しいように見えます。
エンティティが暗黙的または明示的にキャプチャされ、コピーによってキャプチャされない場合、エンティティは参照によってキャプチャされます。追加の名前のない非静的データ メンバーが、参照によってキャプチャされたエンティティのクロージャ型で宣言されているかどうかは指定されていません。
ラムダ内のキャプチャされたオブジェクトは、単なる参照ではなくi
、囲んでいるスコープ内の変数を参照しているようです。constexpr
const
標準では、値によるキャプチャの使用はラムダ オブジェクトの対応するメンバーの使用に変換されると明示的に述べています。そして、5.1.2 は私の解釈が正しいことを暗示していると思います。
参照によるキャプチャが、囲んでいるスコープまたは参照内のオブジェクトを参照するかどうかを明示的に示すものはありますか?