gpt4 book ai didi

具有成员初始化器语法和已删除复制构造函数的 C++ auto

转载 作者:可可西里 更新时间:2023-11-01 18:35:36 25 4
gpt4 key购买 nike

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 &)': attempted to reference a deleted function

我正在使用 visual studio 2015 编译器。我的理解是成员初始化语法编译器应该直接使用默认构造函数,这是在没有自动时发生的情况,并且在 main 中我使用 A a{}。所以我想知道在这种情况下与 auto 有什么关系。

最佳答案

auto a = A {};

仅在 A 可复制构造或可移动构造时有效。您使用 auto 的事实无关紧要。

A a = A {};

还有。

声明一个复制构造函数——即使是一个deleted复制构造函数——禁止隐式声明一个移动构造函数,所以你的类型A既不是复制构造的也不是移动构造的。如果你添加行

A(A&&) = default;

对于A的主体,代码应该再次编译。

实际上,在这种情况下,编译器实际上不会调用任何复制或移动构造函数,而只是在 a 中直接构造对象。但是语言规则要求它仍然必须拒绝有意义的代码,因为一段代码是否被允许不应取决于可选的编译器优化。

此行为(很可能)change在 C++17 中。

关于具有成员初始化器语法和已删除复制构造函数的 C++ auto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34779610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com