gpt4 book ai didi

c++ - move 构造函数和右值引用

转载 作者:行者123 更新时间:2023-11-30 03:20:38 25 4
gpt4 key购买 nike

class Foo {
int m_num;
public:
Foo() {}

Foo(int& n) {m_num = n;}

Foo(int&& n) {m_num = n;}

Foo(const Foo& src) {m_num = src.m_num;}

Foo(Foo&& src) {m_num = src.m_num;}

Foo& operator =(const Foo& src) {
m_num = src.m_num;
return *this;
}

Foo& operator =(Foo&& src) {// move
m_num = src.m_num;
return *this;
}

int& operator =(const int& src) {return m_num = src;}

int& operator =(int&& src) {return m_num = src;}
};

为什么当我调用 Foo f4(Foo(2)); 它调用 Foo(int&& n) 构造函数而不是 Foo(Foo&& src) 构造函数?另外为什么不传递 num 这是一个右值引用调用 move 构造函数?例如,Foo f = num 不调用 move 构造函数。

int main() {
int&& num = 5;
/*int num{ 5 };*/ // initializer-list
Foo f = num; // custom constructor
f = num; // assignment operator
Foo f2 = 6; // custom move constructor
f2 = 10; // custom move assignment
f2 = f; // assignment operator
Foo f3(f); // custom constructor
// f3(f2); // ERROR
f3 = (f2); // assignment operator

Foo f4(Foo(2));

最佳答案

Foo(2) 中,整数是一个右值,需要来自 int&& 的右值引用构造函数。

如果是

 Foo f = num; // custom constructor 

不调用右值构造函数,因为命名值永远不会被视为右值。您必须调用 std::move(num) 才能使其工作。

标准以这种方式定义它,以避免在意外 move 命名值并在以后使用时混淆情况。您必须明确表示 move ,即使变量是右值引用也是如此。

编辑

根据 cppreference c++17 编译器必须省略复制/move 构造函数(即在这种情况下它不能调用或要求存在复制/move 构造函数,这就是为什么你只能看到来自 int&& 的构造函数>):

Foo f4(Foo(2));

这是来自 cppreference 的引述(不如标准,但足够接近):

the language rules ensure that no copy/move operation takes place, even conceptually:

  • In the initialization of a variable, when the initializer expression is a prvalue of the same class type (ignoring cv-qualification) as the variable type:

    T x = T(T(T())); // only one call to default constructor of T, to initialize x

关于c++ - move 构造函数和右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742349/

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