C+之旅+;第4.2.3节中的复制省略 我正在阅读4.2.3节初始化容器,第二版C++教程。

C+之旅+;第4.2.3节中的复制省略 我正在阅读4.2.3节初始化容器,第二版C++教程。,c++,c++17,move,move-semantics,copy-elision,C++,C++17,Move,Move Semantics,Copy Elision,它说: 矢量读取(istream&is) { 向量v; 对于(双d;是>>d;) v、 推回(d); 返回v; } 。。。 为Vector提供移动构造函数的方法,以便从read()返回潜在的大量数据是廉价的,在§5.2.2中进行了解释: 向量v=read(cin);//这里没有向量元素的副本 是否保证上述表达式将被删除(在C++17中)? 我认为返回中的v是一个左值&一个局部变量,因此它可以被省略,但不能保证被省略。 我是不是遗漏了什么 是否保证上述表达式将被删除(在C++17中) 我认为回

它说:

矢量读取(istream&is)
{
向量v;
对于(双d;是>>d;)
v、 推回(d);
返回v;
}
。。。 为
Vector
提供移动构造函数的方法,以便从
read()
返回潜在的大量数据是廉价的,在§5.2.2中进行了解释:

向量v=read(cin);//这里没有向量元素的副本 是否保证上述表达式将被删除(在C++17中)? 我认为返回中的
v
是一个左值&一个局部变量,因此它可以被省略,但不能保证被省略。 我是不是遗漏了什么

是否保证上述表达式将被删除(在C++17中)

我认为回报中的v是一个左值&一个局部变量,所以它可以被省略,但不能保证被省略。我是不是遗漏了什么

非强制省略复制/移动(从C++11开始)操作

在return语句中,当操作数是具有自动存储持续时间的非易失性对象的名称时,该对象不是函数参数或catch子句参数,并且与函数返回类型具有相同的类类型(忽略cv限定)。这种拷贝省略的变体称为NRVO,“名为返回值优化”

因此,即使在C++17中,NRVO也没有得到保证


但是,如果不应用,则会执行移动构造函数(有关详细信息,请参见)。

在C++17之前的版本中不保证,在C++17之后的版本中保证。我相信有人会用大量的参考资料来回答这个问题。@Croolman这是真的吗?据我所知,在C++17以后的版本中,只有return语句中的prvalue才能保证被省略。我不是专家,如果不是,请告诉我。在C++17中不保证NRVO,因此移动构造函数仍然需要可见。或者更确切地说,这是:@JayLee Stroustrup编写的“无元素副本”,这是准确的。如果NRVO在这里不适用,则会(保证)调用move构造函数,而不是copy构造函数。因此,无论是否应用NRVO,元素都保证保持不变。