gpt4 book ai didi

c++ - 当 move 和复制构造函数都存在时,将调用哪一个?

转载 作者:IT老高 更新时间:2023-10-28 23:17:56 24 4
gpt4 key购买 nike

下面是 A 类,它充满了不同类型的构造函数。如果我注释 move 构造函数,则复制构造函数被调用两次:一次是通过值传递一个对象到函数 fun,另一次是从同一个函数返回。

代码片段

A类{

int x;

public :
A() {
cout<<"Default Constructor\n";
}

A(A&& a) : x(a.x){
cout<<"Move Constructor\n";
a.x=0;
}

A(const A& a){
x=a.x;
cout<<"Copy Constructor\n";
}

A fun(A a){
return a;
}

};

int main() {

A a;
A b;
A c;
c=a.fun(b);

}

输出:

Default Constructor

Default Constructor

Default Constructor

Copy Constructor

Move Constructor

但是,如果存在 move 构造函数,则调用它而不是复制构造函数。任何人都可以用一个很好的例子来详细说明这一点,这样我就会清楚这个概念。

非常感谢您的帮助。谢谢。

最佳答案

对于 return 语句中的表达式是自动持续时间变量的情况,该标准允许一种特殊情况。在这种情况下,构造函数重载被挑选出来,就好像 return 中的表达式是一个 rvalue

更准确地说,如果 return 语句中的表达式是符合复制省略条件的自动持续时间变量,或者如果您忽略它是函数参数这一事实,那么,编译器需要将其视为右值以实现重载解析。请注意,在 C++11 中,return 语句的表达式需要将 cv 非限定类型作为函数返回类型。这在 C++14 中有所放松。

例如在C++11中,以下代码调用A的复制构造函数,而不是 move 构造函数:

class A
{
};

class B
{
public:
B(A a) : a(std::move(a)){}
A a;
};

B f(A a)
{
return a;///When this is implicitly converted to `B` by calling the constructor `B(a)`, the copy constructor will be invoked in C++11. This behaviour has been fixed in C++14.
}

关于c++ - 当 move 和复制构造函数都存在时,将调用哪一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27660567/

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