こんにちは!よろしくお願いします。
はじめに、constexpr ラムダにクラス型の変数をキャプチャさせる際、クラスにメンバなどが存在しない場合は、そのクラスの変数に constexpr
修飾をしなくてもキャプチャをすることができるようです。例えば、次のコードはコンパイルが通ります。
cpp
1#include <iostream> 2 3struct s {}; 4 5int main() 6{ 7 s s_{}; 8 constexpr auto lambda = [s_]{}; 9}
しかし、ここにメンバを追加すると、キャプチャすることはできないようでした。例えば、次のコードはエラーになります。
cpp
1#include <iostream> 2 3struct s { int i; }; // int i; を追加 4 5int main() 6{ 7 s s_{}; 8 constexpr auto lambda = [s_]{}; // エラー 9}
ここで、上記の変数 s_
を constexpr
で修飾すると、コンパイルは通るようになるようです。
cpp
1#include <iostream> 2 3struct s { int i; }; 4 5int main() 6{ 7 constexpr s s_{}; // constexpr を追加 8 constexpr auto lambda = [s_]{}; 9}
これは、gcc でも clang でも同様でした。
これらの挙動の違いは、どのような理由によるものなのでしょうか。
ご教授いただければ幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/02 04:59
2019/12/02 13:50
2019/12/02 14:08