C5027“移动赋值运算符被隐式定义为已删除”

时间:2017-02-21 15:24:00

标签: c++ c++11 visual-studio-2015

我有这段代码:

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

我不明白为什么将移动赋值运算符隐式定义为已删除,而它明确定义为默认值。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

lambda表达式的类型不是copy / move assignable:它有一个已删除的复制赋值运算符,没有移动赋值运算符。

如果某个类具有不可移动的非静态数据成员,则该类的默认移动赋值运算符将被定义为已删除。

编译器警告只是建议你这个事实。该警告是否有用是一个不同的问题。