C ++通过完美的rvalues传递值

时间:2016-07-14 10:45:04

标签: c++ c++11 move-semantics rvalue-reference

这可能只是一个“词汇问题”,但是有些东西我没有得到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答案,例如herehere,应该为DoFoo(Foo{})调用移动构造函数 ,但显然不是,无论是否有Foo 移动构造函数,行为都是相同的。

即使用DoFoo(Foo foo)替换DoFoo(Foo&& foo)也不会强制调用移动构造函数

那么,在这些特殊情况下使用移动时,这只是一个词汇问题吗?这是海湾合作委员会的特殊行为吗?或其他什么?

0 个答案:

没有答案