C++ C5027“;移动分配运算符隐式定义为“已删除”;

C++ C5027“;移动分配运算符隐式定义为“已删除”;,c++,c++11,visual-studio-2015,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> &&

我有以下代码:

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;
}

我不明白为什么move赋值操作符会隐式定义为deleted,而显式定义为default。有什么想法吗?

lambda表达式的类型是不可复制/移动分配的:它有一个已删除的复制分配运算符,没有移动分配运算符

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


编译器警告只是告知您这一事实。该警告是否有用是另一个问题。

保持VS2015安装的更新非常重要,此错误已在更新1中修复。我有版本14.0.25431.01更新3,不是最新版本吗?我也收到此警告(使用
/Wall
)@VittorioRomeo这到底是一个什么样的bug?@T.C:如果Vittorio是对的,那么这是一个非常重要的GCC和叮当声bug。那么它是一个可以用额外的
auto g=std::move(f)
编译的bug吗?@user1735003不,这不是赋值。
C5027 'Foo<main::<lambda_e5404f82e4b38ca1d164ce09039df46c>>': move assignment operator was implicitly defined as deleted