如何解决可以在调试版本中关闭 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 在这里不适用,是的,编译器没有义务优化任何构建中的移动,无论是调试还是优化。
这是允许的,但不是必需的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。