gpt4 book ai didi

c++ - 为什么 defaulted-move-ctor 禁止隐式复制 ctor 但不禁止 defaulted-copy-ctor?

转载 作者:行者123 更新时间:2023-11-30 03:19:45 26 4
gpt4 key购买 nike

我似乎遇到过一个例子,其中默认的移动构造函数似乎根据情况被视为用户声明的和非用户声明的:

struct Foo {
int a;
Foo():a(42){};
//Foo(const Foo & other) = default;
Foo(Foo && other) = default;

};

int main() {
Foo f;
Foo g = f;
}

结果:

test.cpp:11:9: error: call to implicitly-deleted copy constructor of 'Foo'
Foo g = f;
^ ~
test.cpp:5:5: note: copy constructor is implicitly deleted because 'Foo' has a user-declared move constructor
Foo(Foo && other) = default;
^

编译器错误是预料之中的,因为 cppreference 告诉我们:

The implicitly-declared or defaulted copy constructor for class T is defined as deleted if any of the following conditions are true:
[...]
T has a user-defined move constructor or move assignment operator;

请注意,默认的构造函数在这里显然算作“用户声明的”。然而,如果我们现在删除第 4 行的注释,从而显式默认复制构造函数,程序将编译而不会出错,即使我上面引用的语句指定:

The implicitly-declared or defaulted copy constructor

这似乎是矛盾的。这是 cppreference 中的错误还是我只是感到困惑?

最佳答案

这看起来像是 cppreference 的错误。声明一个移动构造函数/赋值运算符只会删除一个隐式声明的复制构造函数。事实上,将复制构造函数声明为默认值是用户声明它,因此不适用于这种情况。

关于c++ - 为什么 defaulted-move-ctor 禁止隐式复制 ctor 但不禁止 defaulted-copy-ctor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53422961/

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