为什么在此示例中没有打印任何内容?我在Coliru的Clang编译。
#include <iostream>
struct S
{
S() noexcept = default;
S(S&&) noexcept { std::cout << "move-ctor"; }
};
void f(S) {}
int main()
{
f(S{});
}
答案 0 :(得分:11)
编译器正在执行 copy elision ,即使你的移动构造函数,复制构造函数或析构函数有副作用,也允许按照C ++ 11 Standard的12.8 / 31段进行操作:
当满足某些条件时,允许实现省略类的复制/移动构造 即使为复制/移动操作选择的构造函数和/或对象的析构函数也是如此 有副作用。
即使移动被取消,也会使用 copy elision 一词:
在以下情况下允许复制/移动操作的省略,称为复制省略 (其中 可以合并以消除多个副本):
[...]
- 当复制/移动尚未绑定到引用(12.2)的临时类对象时 对于具有相同cv-unqualified类型的类对象,可以省略复制/移动操作 将临时对象直接构造到省略的复制/移动
的目标中[...]
使用GCC,您可以使用-fno-elide-constructors
来禁止复制省略。在这种情况下,您将看到移动构造函数被调用,如此live example。