如何移动const返回的对象?

 我才不要喜欢你了 发布于 2023-02-11 11:53

最近,我一直在阅读这篇文章和帖子建议停止返回const对象.Stephan T. Lavavej在2013年Going Native的演讲中也给出了这个建议.

我写了一个非常简单的测试来帮助我理解在所有这些情况下调用哪个构造函数/运算符:

返回const或非const对象

如果返回值优化(RVO)启动怎么办?

如果命名返回值优化(NRVO)启动怎么办?

这是测试:

#include 

void println(const std::string&s){
    try{std::cout<

以下是发布模式下的输出(使用NRVO和RVO):

build a
    Default Constructor
build b
    Default Constructor
Constructor nrvo
    Default Constructor
Constructor cnrvo
    Default Constructor
Constructor rvo
    Default Constructor
Constructor crvo
    Default Constructor
Constructor sum
    Default Constructor
    Move Constructor
    Destructor
Constructor csum
    Default Constructor
    Move Constructor
    Destructor
Affectation nrvo
    Default Constructor
    Move Operator
    Destructor
Affectation cnrvo
    Default Constructor
    Copy Operator
    Destructor
Affectation rvo
    Default Constructor
    Move Operator
    Destructor
Affectation crvo
    Default Constructor
    Copy Operator
    Destructor
Affectation sum
    Copy Constructor
    Move Operator
    Destructor
Affectation csum
    Default Constructor
    Move Constructor
    Destructor
    Copy Operator
    Destructor
Done
    Destructor
    Destructor
    Destructor
    Destructor
    Destructor
    Destructor
    Destructor
    Destructor

我不明白的是: 为什么在"Constructor csum"测试中使用移动构造函数?

返回对象是const所以我真的觉得应该调用复制构造函数.

我在这里错过了什么?

它不应该是编译器的错误,Visual Studio和clang都会提供相同的输出.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有