2017-03-01 11 views
7

コード:ラムダの外側のスコープ名にアクセスするには、g ++またはVisualかどちらかですか?

auto main() -> int 
{ 
    int b = 42; 
    auto lambasta = [&]() 
    { 
     using B_type = decltype(b); 
     return B_type{}; 
    }; 
    (void) lambasta; 
} 

はMinGWのgの++ 6.3.0 -std=c++14 -Wall -pedantic-errorsとなしの診断をコンパイルします。 Visual C++ 2015のアップデート3、

 
foo.cpp(6): error C2065: 'b': undeclared identifier 
+0

コンパイルさえclagg/gccの[デモ]のキャプチャなし(http://coliru.stacked-crooked.com/a/002edb55e3a07e00)。 – Jarod42

+0

キャプチャリストの '&b'は機能しますか? –

+0

@TheQuantumPhysicist:はい、名前の明示的なキャプチャは、Visual C++が存在することを理解するのに役立ちます。名前の実際のODRの使用も同様です(言及の前に)。残念ながら、それは私の元の問題の回避策ではありません。マクロの引数として指定された式で名前が発生します。 –

答えて

1

可能な回避策を使用してコンパイルに失敗:

template<typename T> 
struct wrapper 
{ 
    using wrapped_t = T; 
}; 

auto main() -> int 
{ 
    int b = 42; 
    auto lambasta = [&, a = wrapper<decltype(b)>()]() 
    { 
     using B_type = typename decltype(a) ::wrapped_t; 
     return B_type{}; 
    }; 
    (void) lambasta; 
} 

GCC 6.3とMSVC 2015上で動作3まで

+0

私はそれが好きですが、私はすでにコードを書き直しました。 Heh。 –

関連する問題