gpt4 book ai didi

c++ - move 构造函数在 C++ 中调用了两次吗?

转载 作者:IT老高 更新时间:2023-10-28 21:34:14 26 4
gpt4 key购买 nike

看看这段代码:

class Foo
{
public:

string name;

Foo(string n) : name{n}
{
cout << "CTOR (" << name << ")" << endl;
}

Foo(Foo&& moved)
{
cout << "MOVE CTOR (moving " << moved.name << " into -> " << name << ")" << endl;

name = moved.name + " ###";
}

~Foo()
{
cout << "DTOR of " << name << endl;
}
};

Foo f()
{
return Foo("Hello");
}

int main()
{
Foo myObject = f();

cout << endl << endl;
cout << "NOW myObject IS EQUAL TO: " << myObject.name;
cout << endl << endl;

return 0;
}

输出是:

[1] CTOR (Hello)

[2] MOVE CTOR (moving Hello into -> )

[3] DTOR of Hello

[4] MOVE CTOR (moving Hello ### into -> )

[5] DTOR of Hello ###

[6] NOW two IS EQUAL TO: Hello ### ###

[7] DTOR of Hello ### ###

重要提示:出于测试目的,我使用 -fno-elide-constructors 禁用了复制省略优化。

函数 f() 构造一个临时 [1] 并返回它调用 move 构造函数将资源从该临时“move ”到 myObject [2] < em>(另外,它添加了 3 # 个符号)。

最终,临时对象被销毁[3]


我现在希望 myObject 完全构造,并且它的 name 属性是 Hello ###

相反, move 构造函数被再次调用,所以我只剩下 Hello ### ###

最佳答案

两个 move 构造函数调用是:

  1. Foo("Hello") 创建的临时值 move 到返回值中。
  2. f() 调用返回的临时值 move 到 myObject 中。

如果你使用 braced-init-list 来构造返回值,那么只有一个 move 构造:

Foo f()
{
return {"Hello"};
}

这个输出:

CTOR (Hello)
MOVE CTOR (moving Hello into -> )
DTOR of Hello
NOW myObject IS EQUAL TO: Hello ###
DTOR of Hello ###

Live Demo

关于c++ - move 构造函数在 C++ 中调用了两次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594496/

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