为什么在 const 对象上调用 std::move 在传递给另一个对象时会调用复制构造函数
Why does calling std::move on a const object call the copy constructor when passed to another object?
为什么在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&&
,它不能绑定到 T&&
参数。下一个最佳匹配项是复制构造函数,它被删除,因此出现错误。
显式delete
函数并不意味着它不可用于重载解析,但如果它确实是重载解析选择的最可行的候选函数,则它是编译器错误。
结果是有意义的,因为移动构造是从源对象窃取资源从而改变它的操作,因此您不应该仅仅通过调用 std::move
来对const
对象执行此操作。
std::move(x)
的类型是Foo const&&
不能绑定到Foo&&
。原因与无法绑定到T&
的T const&
相同。但是,您可以让构造函数采用Foo const&&
。很可能你将无法真正移动相应对象的数据,但是,例如,在你的例子中没有数据,即以下代码工作正常:
#include <iostream>
struct Foo {
Foo() = default;
Foo(Foo &&) { std::cout << "Moven"; }
Foo(Foo const&&) { std::cout << "Move constn"; }
Foo(Foo const &) = delete;
};
int main() {
Foo const x; Foo y(std::move(x));
}
相关文章:
- 检查哪个对象调用了另一个对象的对象方法
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 调用对象类方法,该方法在另一个对象类中的向量中
- 为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次
- 我如何有boost.python调用一个函数来处理对象
- 指向struct的指针,包含指向对象的指针,我想调用一个函数
- 使用SWIG包装C 类,该类调用另一个对象成员函数
- 从另一个对象调用成员函数时出现问题
- 将一个对象的函数设置为由arduino库中的另一个对象调用
- 尝试将调用对象与另一个对象进行比较时出现分段错误
- 当一个没有参数的成员函数被c++中的一个对象调用时会发生什么
- 为什么在 const 对象上调用 std::move 在传递给另一个对象时会调用复制构造函数
- 从另一个 std::thread 调用 Qt 对象方法
- 将一个对象发送到另一个对象并调用first-objects方法
- 从另一个对象调用一个对象的函数时未定义的引用
- 你能从DLL中动态调用一个对象吗