gpt4 book ai didi

c++ - C++11 标准中的哪个子句支持在下面的函数 foo() 的返回中调用 move 构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:47 24 4
gpt4 key购买 nike

C++11 标准中的哪个子句支持在下面的函数 foo() 的返回中调用 move 构造函数?

#include <iostream>

class A
{
public:
A() { std::cout << "Ctor\n"; }
A(const A&) {std::cout << "Copy ctor\n";}
A(A&&) {std::cout << "Move ctor\n";}
};

A foo(A&& ra) { return std::move(ra); }

int main()
{
A a = foo(A());
}

我相信这个问题昨天已经关闭,现在它被“搁置”,关闭的原因是它过于本地化。我很难理解 SO 中询问有关 C++11 标准的特定问题的帖子如何被视为“过于本地化”。对我来说,这是一个自相矛盾的说法,因为标准是“事实上”每个 C++ 程序员都应该寻找的最终文档,以防对语言有疑问。

最佳答案

关于代码有很多条款。特别是初始化(第 8 条后面)、重载决议(第 13 条)以及更基本的第 3 条和第 5 条,以理解表达式和引用类型的值类别。

首先是表达式 A()是临时变量的默认构造产生的类纯右值。

它初始化右值引用 ra通过直接引用绑定(bind)。

ra初始化 move 的参数通过直接引用绑定(bind),和 move返回类型为 A 的 xvalue , 再次通过直接引用绑定(bind)初始化,它初始化 foo 的返回值,通过重载解析到 move 构造函数,将第一个临时对象 move 到 foo 的返回值中, 也是临时的。

表达式foo(A())是指代第二个临时值的类纯右值。

这通常会复制初始化 a通过重载将纯右值解析为 move 构造函数,并 move 构造 a来自 foo 的返回值- 但是由于 12.8/32p3:

when a temporary class object that has not been bound to a reference (12.2) would be copied/moved to a class object with the same cv-unqualified type, the copy/move operation can be omitted by constructing the temporary object directly into the target of the omitted copy/move

因此返回值为foo通常直接在a的存储中构造它, 并且省略了第二步构造。

关于c++ - C++11 标准中的哪个子句支持在下面的函数 foo() 的返回中调用 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17296470/

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