繁体   English   中英

C ++ auto with member initializer syntax and deleted copy constructor

[英]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构造对象。 但是语言规则要求它仍然必须拒绝有意义的代码,因为一段代码是否被允许不应该依赖于可选的编译器优化。

这种行为(很可能) 在C ++ 17中发生变化

你的理解是正确的,所以让我们一步一步看看这里发生了什么。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM