[英]C++ auto with member initializer syntax and deleted copy constructor
class A
{
int a;
public:
A(const A&) = delete;
A& operator=(const A&) = delete;
A() : a {0}
{ }
};
int main()
{
auto a = A {};
}
上面的代码没有编译,我得到以下错误:C2280'A :: A(const A&)':尝试引用已删除的函数
我正在使用visual studio 2015编译器。 我的理解是使用成员初始化语法编译器应该直接使用默认构造函数,这是在没有auto时发生的情况,而在main中我使用A a{}
。 所以我想知道在这种情况下与auto的交易是什么。
auto a = A {};
仅当A
是可复制的构造或移动构造时才有效。 您使用auto
的事实无关紧要。 同样的情况也是如此
A a = A {};
同样。
声明一个复制构造函数 - 甚至是delete
一个 - 禁止隐式声明一个移动构造函数,因此你的类型A
既不是可复制的,也不是可构造的。 如果添加该行
A(A&&) = default;
到了A
的主体,代码应该再次编译。
实际上,在这种情况下,编译器实际上不会调用任何副本或移动构造函数,只需在a
构造对象。 但是语言规则要求它仍然必须拒绝有意义的代码,因为一段代码是否被允许不应该依赖于可选的编译器优化。
你的理解是正确的,所以让我们一步一步看看这里发生了什么。
A {};
正如你所说,成员初始化语法,完全是犹太洁食。
auto a = (expression of some kind)
然后你正在构建auto a
。 执行类型推断后,这相当于......
A a = (expression of some kind)
这看起来像一个复制构造函数。 你删除了哪个。
你应该这样使用auto:
auto a = new A();
如果您不想使用auto,这是c ++ 11方式:
A a{};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.