这可能只是一个“词汇问题”,但是有些东西我没有得到rvalue引用并按值传递。
如果我有这样的代码(ideone it)
struct Foo
{
Foo() { printf("Ctor\n"); }
Foo(const Foo& other) { printf("Copy\n"); }
Foo(Foo&& other) { printf("Move\n"); }
~Foo() { printf("Dtor\n"); }
};
void DoFoo(Foo foo) { printf("Foo\n"); }
int main()
{
Foo foo;
DoFoo(foo);
DoFoo(Foo{});
return 0;
}
它会给我这个输出(ideone result复制粘贴)
Ctor 0x96eaa10 0
Copy 0x96eaa20 0
Foo 0x96eaa20 0
Dtor 0x96eaa20
Ctor 0x96eaa20 1
Foo 0x96eaa20 1
Dtor 0x96eaa20
Dtor 0x96eaa10
我不明白的是,根据许多stackoverflow答案,例如here或here,应该为DoFoo(Foo{})
调用移动构造函数 ,但显然不是,无论是否有Foo
移动构造函数,行为都是相同的。
即使用DoFoo(Foo foo)
替换DoFoo(Foo&& foo)
也不会强制调用移动构造函数。
那么,在这些特殊情况下使用移动时,这只是一个词汇问题吗?这是海湾合作委员会的特殊行为吗?或其他什么?