関数ローカルの typedef は C++0x ラムダ内で可視ですか?
-
22-09-2019 - |
質問
奇妙な問題に遭遇しました。次の簡略化されたコードは、MSVC 2010 の問題を再現します。
template <typename T>
struct dummy
{
static T foo(void) { return T(); }
};
int main(void)
{
typedef dummy<bool> dummy_type;
auto x = []{ bool b = dummy_type::foo(); };
// auto x = []{ bool b = dummy<bool>::foo(); }; // works
}
の typedef
ローカルで作成した関数がラムダには表示されないようです。交換すると typedef
実際の型では、期待どおりに動作します。
その他のテスト ケースをいくつか示します。
// crashes the compiler, credit to Tarydon
int main(void)
{
struct dummy {};
auto x = []{ dummy d; };
}
// works as expected
int main(void)
{
typedef int integer;
auto x = []{ integer i = 0; };
}
現時点では、テストに使用できる g++ がありません。これは C++0x の奇妙なルールですか、それともコンパイラの単なるバグですか?
上記の結果から、私はバグに傾いています。ただし、クラッシュは間違いなくバグです。
とりあえず2件提出しました バグレポート.
上記のコード スニペットはすべてコンパイルされるはずです。このエラーは、ローカルに定義されたスコープでのスコープ解決の使用に関係しています。(発見者 分割.)
そしてクラッシュバグと関係があるのは...知るか。:)
アップデート
による バグレポート, 、両方とも Visual Studio 2010 の次のリリースで修正されています。(ただし、そうではないようです。おそらくVS11。)
解決
N3000から、5.1.2 / 6、
ラムダ式さん 複合文の利回り 関数の関数本体(8.4) 呼び出し演算子が、目的のため 名前検索(3.4)、... 化合物-文はで考えられています ラムダ式の文脈ます。
驚くべきことではないが、局所型が表示されなければならない。
他のヒント
機能ローカル列挙のいずれかラムダによって検出することができない。
int main()
{
enum E {A, B, C};
auto x = [](){ int a = A; };
//auto y = [](){ E a = A; }; // this will crash the compiler
}
エラーC3493:デフォルトのキャプチャモードが指定されていないため、「A」が暗黙的に取得することができません。
続きを問題-多分、workroundあるもののます。
int main()
{
enum E {A, B, C};
auto x = [=](){ int a = A; };
// typedef E F;
// auto y = [=](){ F a = A; }; // this compiles ok
}
これは本当にあなたの質問への答えではなく、単に問題をさらに探求します。
:コンパイラはの種類の扱う問題はので、このアウトが試した、囲みスコープ内で宣言している場合、私は思っていました#include <iostream>
template <typename Func>
void do_test(Func pFunc) {
}
template <typename T>
void test_trait(void) {
class Something { public: int foo; };
do_test ([] (T pX) {
Something A; A.foo = 12;
});
}
int main(void) {
test_trait<int> ();
}
ここで、私はちょうど囲みスコープ内のローカル種類を作成し、ラムダ関数内から、それを使用しようとしています。これは、(のVisual Studio 2010ベータ2で)コンパイルしていないが、それは実際にはC1001内部エラーでコンパイラがクラッシュするだけでなく。