2017-02-21 7 views
3

私はこのコードを持っている:C5027「削除済みとして移動代入演算子を暗黙的に定義された」

template < typename TFunc > 
class Foo 
{ 
public: 
    Foo(TFunc func) : func_(func) {} 
    Foo(Foo<TFunc> const &) = delete; 
    Foo<TFunc> & operator=(Foo<TFunc> const &) = delete; 
    Foo(Foo<TFunc> &&) = default; 
    Foo<TFunc> & operator=(Foo<TFunc> &&) = default; 
private: 
    TFunc func_; 
}; 

int main() 
{ 
    auto func = []() {}; 
    auto f = Foo<decltype(func)>(func); 
    return 0; 
} 

私は/Wallフラグ付きのVisual Studio 2015でこのコードをコンパイルすると、私は次の警告を得る:

C5027 'Foo<main::<lambda_e5404f82e4b38ca1d164ce09039df46c>>': move assignment operator was implicitly defined as deleted 

移動代入演算子が明示的にデフォルトとして定義されている間に、暗黙的に削除として定義される理由はわかりません。何か案が?

+4

あなたのVS2015のインストールを最新の状態に保つことは非常に重要です。このバグはアップデート1で修復されました。 –

+0

私はバージョン14.0.25431.01アップデート3を持っています、それは最新バージョンですか? – user1735003

+0

私はこの警告も受け取ります( '/ Wall'と一緒に)。 – molbdnilo

答えて

3

ラムダ式の型は、コピー/移動アサイナブルではありません。コピーアサイン演算子は削除され、移動代入演算子は削除されています。

クラスにmove assignableでない非静的データメンバーがある場合、そのクラスのデフォルトの移動代入演算子は削除されたものとして定義されます。

コンパイラの警告は、この事実を単にあなたに通知しています。その警告が有用かどうかは、別の質問です。

+0

それは実際には追加の 'auto g = std :: move(f)'でコンパイルできるバグです。 ? – user1735003

+1

@ user1735003いいえ、それは割り当てではありません。 –

関連する問題