c++ - 非生成的特殊成员函数与删除的特殊成员函数

标签 c++ c++11 move-semantics

<分区>

这会编译并调用复制构造函数:

struct foo {
    foo() = default;
    foo(const foo&) { cout << "copy ctor!" << endl; }
    //foo(const foo&&) = delete;
};

int main() {
    foo a;
    foo b(move(a));

这不编译:

struct foo {
    foo() = default;
    foo(const foo&) { cout << "copy ctor!" << endl; }
    foo(const foo&&) = delete;
};

int main() {
    foo a;
    foo b(move(a));

我知道在第一种情况下为什么调用拷贝 - 没有生成 move 构造函数。但是为什么第二个 snipper 不能编译呢?它认为它会再次调用复制器。

here是在线编译器的链接

最佳答案

区别归结为缺少 move 构造函数与删除 move 构造函数。这两者并不等同。


在第一种情况下,复制构造函数的存在阻止了隐式 move 构造函数的生成。因此,对 foo(foo&&) 的重载解析会找到一个可行的候选者:

foo(const foo& );

然后默认选择该候选人。

在第二种情况下,您确实有一个 move 构造函数。过载解析会找到两个可行的候选者:

foo(const foo& ); // as before
foo(foo&& );      // now this one also exists

move 构造函数是更好的匹配项,因此它被选为最佳可行候选者。但是,由于它被明确定义为已删除,因此选择它的格式不正确。因此编译错误。

关于c++ - 非生成的特殊成员函数与删除的特殊成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779134/

相关文章:

c++ - 从 const char* 参数中取出一个索引

sockets - C++ - 如何从 struct sockaddr 获取 IP 和端口

c++ - C++ 预处理器中的 R 和 L 有什么特别之处?

c++ - 如何识别部分模板特化

c++ - 参数语法

c++ - asio 异步服务器不接受连接

c++ - 为什么`std::move`被命名为`std::move`?

c++ - move 构造函数不会被解雇

iterator - Rust 可以使用传递给函数的迭代器吗?

c++ - 为自定义 vector 类中的特定元素赋值。作为 [5] = 3 C++