首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++03中的复制省略

c++03中的复制省略
EN

Stack Overflow用户
提问于 2021-03-01 20:57:03
回答 1查看 82关注 0票数 1

复制-省略

在某些情况下,在c++17中是强制的,在c++11/14中是允许的。这特别涉及到复制初始化。例如,下面的程序

代码语言:javascript
复制
#include 

struct A
{
  explicit A(int){ std::cout << "conversion" << std::endl; }
  A(const A&) { std::cout << "copy constructor" << std::endl; }
};

int main()
{
    A b = A(3);
}

期望在c++17中生成一个输出

代码语言:javascript
复制
conversion

并且在c++11/14中可以产生相同的输出。考虑到这些问题,gcc 10.1.0和clang 11.1.0都会生成上面的输出

或者

,除非显式禁用可选的构造函数省略

..。

但是c++03标准呢?是否允许省略复制构造函数

在拷贝初始化中

什么?gcc和clang with

始终禁止复制构造函数(除非指定

)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 21:12:46

是的,在C++03和C++98中允许复制省略。这是C++98和C++03的段落:

复制操作的非强制省略

在下列情况下,即使复制构造函数和析构函数有明显的副作用,编译器也可以忽略类对象的复制构造。对象被直接构造到存储中,否则它们将被复制到该存储中。这是一个优化:即使当它发生时,复制构造函数没有被调用,它仍然必须存在和可访问(就像根本没有发生优化一样),否则程序是病态的:

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

在对象的初始化中,当源对象是一个无名的临时对象,并且与目标对象具有相同的类类型(忽略cv限定)时。当无名的临时值是返回语句的操作数时,这种复制省略的变体称为RVO,即“返回值优化”。

当发生复制省略时,该实现将被省略的复制操作的源和目标简单地视为引用同一对象的两种不同方式,并且该对象的销毁发生在这两个对象在没有优化的情况下将被销毁的较晚时间

cppreference首选项

我删除了从C++11开始才有效的所有内容。

C++98、C++03和C++11之间关于ellision的唯一区别是移动操作和异常处理。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66422584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档