我有一个关于移动语义的一般性问题。昨天,我只是四处游玩,以便对这个话题感到更舒服。在这里,我添加了复制和移动构造函数操作符,只需登录到控制台:
#include <iostream>
class Test {
public:
const char* value = "HI";
Test(){
std::cout << "Default Constructed\n";
}
Test(Test &&source) {
std::cout << "Move Constructed\n";
}
Test(const Test &source) {
std::cout << "Copy Constructed\n";
}
}; 现在当我打电话
void showMe(Test&& test) {
std::cout << test.value;
}
int main() {
Test test1;
// Test test2{test1};
showMe(std::move(test1));
return 0;
}控制台注销:
默认构造的
HI
这一点对我来说很清楚,因为我们只是将所有权转移到showMe。但是为什么未调用Test的move构造函数运算符?
但是现在,如果我将showMe函数改为
void showMe(Test test) {
std::cout << test.value;
}控制台显示:
默认构造的
Move构造
HI
所以我的问题是,为什么移动构造器操作符在第一种情况下没有执行,而在第二种情况下呢?我通常认为在第一种情况下,Test的move操作符应该执行。这两宗个案有何分别?
发布于 2022-09-01 08:22:11
,但是为什么未调用测试的move构造函数运算符?
因为您一直通过对rvalue的引用对同一个对象进行操作。没有新的对象正在构建,因此不需要构造函数。
可以想象,您可以继续向下传递该引用,就像对const的常规引用或引用一样--引用的本质就是它们不是对象。
在第二个示例中,函数的参数是一个值,为了构造该值,第二个构造函数需要触发。
发布于 2022-09-01 08:21:51
首先,您传递一个引用。因此,不需要创建新的对象。
发布于 2022-09-01 10:00:24
在void中,showMe( test )形式参数期望通过值传递,所以这就是迁移构造\get被调用的原因(传递值意味着参数被复制到函数中)。调用移动构造函数) .in第二种情况下,showMe(测试&测试)形式参数期望引用传递,因此没有创建新对象,也没有调用构造函数
https://stackoverflow.com/questions/73566210
复制相似问题