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