【发布时间】:2021-12-01 22:26:46
【问题描述】:
C++17 中是否保证了“移动省略”?让我解释一下我的意思。在几乎每一篇关于 C++17 介绍的文章中,都可以找到一个术语:“保证 RVO 的复制省略”,这有点不言自明。但是搬家施工呢?
我们看下面的代码,很简单,有一个不可复制的类型,还有两个函数,一个是通过值取NonCopyable参数,第二个是通过右值引用来取。
#include <iostream>
struct NonCopyable
{
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
NonCopyable(NonCopyable&& other) noexcept
{
std::cout << "Move ctor\n";
}
};
void func_by_value(NonCopyable cp)
{
auto x = std::move(cp);
}
void func_by_rvalue_ref(NonCopyable&& cp)
{
auto x = std::move(cp);
}
int main()
{
std::cout << "Pass by value:\n";
func_by_value(NonCopyable());
std::cout << "\nPass by rvalue_ref\n";
func_by_rvalue_ref(NonCopyable());
}
我使用 GCC(trunk) 编译了两次,使用以下标志,结果略有不同。
程序输出: 按值传递: 移动 ctor 移动 ctor 通过 rvalue_ref 移动 ctor(1) -O0 -std=c++11 -fno-elide-constructors
程序输出: 按值传递: 移动 ctor 通过 rvalue_ref 移动 ctor(2) -O0 -std=c++17 -fno-elide-constructors
所以我的问题是 - 在使用 C++17 时,移动限制被忽略有什么变化? Compiler explorer
【问题讨论】:
标签: c++ c++17 copy-elision