为什么返回值优化在这里发生
Why is return value optimization happening here
从这篇文章中它说
当一个无名的临时的,不绑定到任何引用,将被移动 或复制到相同 CV 非限定类型的对象中, 省略复制/移动。当构造该临时时,它是 直接在存储中构建,否则它将被移动 或复制到。当无名临时是返回的参数时 语句,这种复制 elision 的变体称为 RVO,"返回值 优化"。
因此,为了测试这个概念,我尝试了以下实验。
class C
{
public:
C()
{
std::cout << "Constructor of C." << std::endl;
}
C(const C &)
{
std::cout << "Copy-constructor of C." << std::endl;
}
};
C func()
{
const C c;
return c; //c is not a nameless and is not CV unqualified as it is a const type.
}
int main(int argc, char **argv)
{
C c = func();
}
输出:C 的构造器
我期待:C 的构造函数C 的复制构造函数C 的复制构造函数
我的问题是为什么这里会发生返回值优化?
因为你引用了一个不相关的段落。相关的是上面的一个(来自同一来源):
如果函数按值返回类类型,并且 return 语句的表达式是具有自动存储持续时间的非易失性对象的名称,该对象不是函数参数或 catch 子句参数,并且与函数的返回类型具有相同的 cv 非限定类型,则省略复制/移动。
任何规定的条件都允许复制省略。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么thread_local变量在这里从未初始化?
- 为什么我必须在这里使用dynamic_cast
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 为什么 C++20 中的 [[可能]] 属性在这里引发警告?
- 我在这里正确传递参数了吗?
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 移动语义在这里如何工作?
- 如何在这里循环运行?
- 为什么枚举变量在这里是右值?
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 试图美化这个Arduino代码[初学者在这里]
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 在这里使用删除运算符是否正确,我很困惑
- const 是否允许在这里进行(理论)优化?
- 为什么返回值优化在这里发生