可以在调试版本中关闭 NRVO 吗?

问题描述

在程序如下

#include <iostream>

struct A 
{ 
    A() { std::cout << "0"; }
    A( const A & ) { std::cout << "1"; }
    A( A && ) noexcept { std::cout << "2"; }
};

A foo()
{
    A res;
    return res;
}
 
int main()
{
    const A a = foo();
    (void)a;
}

我希望在 foo() 中进行命名返回值优化,因此不会调用复制和移动构造函数。确实 gcc 和 clang 打印了“0”。

但 Visual Studio 2019 在调试配置中打印“02”。是否允许编译器在调试版本中避免 NRVO?

解决方法

由于 mandatory copy elision 在这里不适用,是的,编译器没有义务优化任何构建中的移动,无论是调试还是优化。

这是允许的,但不是必需的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...