gpt4 book ai didi

c++ - 右值作为构造对象的初始化器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:42 26 4
gpt4 key购买 nike

我是编程新手。对不起,我的英语不好。我尝试使用右值作为初始对象的初始化程序。因此,根据代码,它会打印出使用的构造函数和赋值运算符是什么。但结果是对象“what2”和“what3”,它们没有打印出任何东西。这是代码:

#include <iostream>
using namespace std;
class X{
public:
int x;
X()= default;
X(int num):x{num}{}
X(const X& y){
x = y.x;
std::cout << "copy constructor" << std::endl;
std::cout << x << std::endl;

}
X& operator=(const X& d){
x = d.x;
std::cout << "copy assignment" << std::endl;
return *this;
}
X(X&& y){
x = y.x;
std::cout << "move constructor" << std::endl;
}
X& operator=(X&& b){
x = b.x;
std::cout << "move assignment" << std::endl;
return *this;
}
};

X operator +(const X& a,const X& b){
X tmp{};
tmp.x = a.x +b.x;
return tmp;
}

int main(int argc, const char * argv[]) {
X a{7} , b{11};
X what1;
cout << "---------------" << endl;
what1 = a+b;
cout << "---------------" << endl;
X what2{a+b};
cout << "---------------" << endl;
X what3 = a+b;
cout << "---------------" << endl;
std::cout << what1.x << std::endl;
std::cout << what2.x << std:: endl;
std::cout <<what3.x << std::endl;
return 0;
}

输出是:

---------------
move assignment
---------------
---------------
---------------
18
18
18
Program ended with exit code: 0

只有“what1”正确使用赋值。那么,我如何使用右值来初始化一个对象呢?并使用 operator= 来初始化一个对象?非常感谢。

最佳答案

您的代码可能会导致使用移动操作,但您的编译器已选择 elide这些移动并直接在调用站点分配 operator+ 的返回值。如果您在编译器中禁用复制省略(GCC 或 Clang 中的 -fno-elide-constructors),您会看到这种情况发生。

您的移动构造函数和赋值运算符将在不允许复制省略的上下文中成功使用,例如:

X what2 { std::move(what1) }; //can't elide copy, move constructor used

关于c++ - 右值作为构造对象的初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34614924/

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