我有这段代码:
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
我不明白为什么将移动赋值运算符隐式定义为已删除,而它明确定义为默认值。有什么想法吗?
答案 0 :(得分:3)
lambda表达式的类型不是copy / move assignable:它有一个已删除的复制赋值运算符,没有移动赋值运算符。
如果某个类具有不可移动的非静态数据成员,则该类的默认移动赋值运算符将被定义为已删除。
编译器警告只是建议你这个事实。该警告是否有用是一个不同的问题。