c++ - 为什么在传递给另一个对象时调用 const 对象上的 std::move 会调用复制构造

为什么在 const 对象上调用 std::move 在传递给另一个对象时会调用复制构造函数?具体代码

#include <iostream>

struct Foo {
    Foo() = default;
    Foo(Foo && x) { std::cout << "Move" << std::endl; }
    Foo(Foo const & x) = delete;
};

int main() {
    Foo const x; Foo y(std::move(x)); 
}

编译失败:

g++ -std=c++14 test07.cpp -o test07
test07.cpp: In function 'int main()':
test07.cpp:10:36: error: use of deleted function 'Foo::Foo(const Foo&)'
     Foo const x; Foo y(std::move(x)); 
                                    ^
test07.cpp:6:5: note: declared here
     Foo(Foo const & x) = delete;
     ^
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1

当然,我预计它会失败,因为我们无法移动 const 值。同时,我不明白代码在尝试调用复制构造函数之前所采用的路线。意思是,我知道 std::move 将元素转换为 x 值,但我不知道之后关于 const 的事情如何进行。

最佳答案

t const参数调用std::move的结果类型是T const&&,不能绑定(bind)到T&& 参数。下一个最佳匹配是您的复制构造函数,它被删除,因此出现错误。

显式删除函数并不意味着它不能用于重载解析,但如果它确实是重载解析选择的最可行的候选者,那么它就是编译器错误。

结果是有道理的,因为移动构造是一个从源对象窃取资源的操作,从而改变它,所以你不应该仅仅通过调用来对 const 对象执行此操作std::move.

关于c++ - 为什么在传递给另一个对象时调用 const 对象上的 std::move 会调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27810535/

相关文章:

c++ - 在创建派生类对象时将参数传递给基类构造函数

c++ - `typedef typename Foo::Bar Bar'的模板声明

c++ - openMP 嵌套并行 for 循环与内部并行 for

c++ - range-for循环中的访问索引

c++ - 动态数组上基于范围的for循环?

c++ - 如何找到当前的系统时区?

c++ - 我可以使用基于范围的 for 循环轻松迭代 map 的值吗?

c++ - 在 C/C++ 中从 TCP 套接字读取的正确方法是什么?

c++ - 在构造函数中调用类成员的构造函数

c++ - Emacs - 覆盖缩进