![]() |
1
24
Pre-C++17,
虽然临时文件仍然存在,但如果不删除,它将处于“已移出”状态,并且不再拥有任何资源,因此它不会影响资源的使用计数。
由于C++ 17,所以没有复制的临时性,因为有保证的拷贝/移动删除,以及
阿西 来自said的确切措辞 reference :
在我们的例子中,
|
![]() |
2
12
c++ 有一个奇怪的概念叫做省略。 省略是一个允许编译器获取两个对象的生存期并合并它们的过程。通常人们说复制或移动构造函数“被省略”,但真正被省略的是 身份 两个看似不同的物体。 根据经验,当一个匿名的临时对象被用来直接构建另一个对象时,它们的生命周期可以一起省略。所以:
还有一些情况下,命名变量可以用返回值来消除,并且可以同时消除两个以上的对象:
只有一个实例
在 c++17 事情更进一步。在此之前,所讨论的对象必须在逻辑上是可复制/可移动的,而省略只是取消了对构造函数的调用并共享对象标识。 后 C++ 17 过去被省略的一些东西(在某种意义上)是“有保证的省略”,实际上是另一回事。“有保证的省略”基本上是指prvalues(过去在pre中是临时的东西- C++ 17 )现在是关于如何创建对象的抽象指令。 在某些情况下,临时对象是由它们实例化的,但在其他情况下,它们只是用于在其他位置构造其他对象。 所以在 C++ 17 您应该想到这个函数:
作为返回的函数
关于如何创建
你在说“使用说明
同样地,
这是一个函数,返回有关如何创建
在这里,您将这些说明应用于
在没有敌方编译器标志的前-[c++ 17 ]中,省略的结果实际上是相同的。在这种情况下,临时身份与
在任何实际情况下都不会有临时的
如果你确实传递了这样的旗帜,
|
![]() |
3
3
除搬家施工外
以及一个函数
当函数参数像这样作为右值传递时
除非使用
因为拷贝删除是有保证的。记住:作为函数参数传递的临时对象“在包含它的完整表达式结束后销毁” 只有在有临时 一个代码片段可能会建议存在一个即使它很容易(并且因为C++ 17:保证)被优化出来。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 7 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 7 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 7 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 7 月前 |