2017-08-24 3 views
6

ラムダの中でメンバ関数を呼び出すときに問題が発生し、捕捉されたthisが見つかりました。関数のconstバージョンと非constバージョンがあり、型にテンプレート化されています。これをラムダで捕捉するためのメンバ関数への曖昧な呼び出し

次のコードがエラーを示しています

struct TEST 
{ 
    template <typename T> 
    void test() {} 

    template <typename T> 
    void test() const {} 

    TEST() 
    { 
    [this]() 
    { 
     test<void>(); 
    }(); 
    } 
}; 

メッセージ:http://rextester.com/MLU2098

source_file.cpp(13): error C2668: 'TEST::test': ambiguous call to overloaded function 
source_file.cpp(7): note: could be 'void TEST::test<void>(void) const' 
source_file.cpp(4): note: or  'void TEST::test<void>(void)' 
source_file.cpp(13): note: while trying to match the argument list '()' 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64 

を私はこの行動が正しかったかどうかわからなかったし、Microsoftのコンパイラでだけの問題なので、私がテストしましたコンパイラエクスプローラでgccとclangを使ってコードをコンパイルし、両方ともエラーなしでコードをコンパイルしました。

ここで正しい動作を表示しているコンパイラはどれですか?

+2

を(http://rextester.com/MLU2098)[ここMSVCとREPROです] – AndyG

答えて

6

これはMSVCの問題です。暗黙的なthisパラメータにはcv修飾があります。そのため、cv修飾子でメンバ関数を多重定義することができます。 c'torの本体では、thisは非constオブジェクトを指しています(初期化は、結局オブジェクトを変更する必要があることを意味します)。

これは、どのオーバーロードを呼び出すかを決定するのに十分です。

何らかの理由で、MSVCは混乱します。しかし、あなたが明示的thisポインタにアクセスすることにより、メンバ関数を呼び出す場合、混乱が消滅:

void bar() 
{ 
    [this]() 
    { 
    this->test<void>(); 
    }(); 
} 

Live MSVC Example

関連する問題