我想我可能已经错过了移动构造中的微妙之处,因为当我将行Foo copy(*this);
更改为decltype(*this) copy(*this);
时,我对输出完全感到惊讶。
我检查了它,clang ++ - 3.5和g ++ - 4.9,具有相同的行为。
非常感谢来自C ++ 11专家的快速提示。
更新:只是强制编译器打印decltype(*this)
的类型,它实际上是一个引用类型,即Foo&
。
class Foo {
public:
Foo(int a): val(a) {}
operator int() { return val; }
auto& operator++() {
val++;
return *this;
}
auto operator++(int) {
//Foo copy(*this);
decltype(*this) copy(*this);
++(*this);
return copy;
}
private:
int val;
};
int main()
{
Foo foo=1;
cout << "foo++ = " << foo++ << "\n";
cout << "foo++ = " << foo++ << "\n";
cout << "foo = " << foo << "\n";
return 0;
}
输出
foo++ = 2
foo++ = 3
foo = 3
答案 0 :(得分:2)
在您的案例中,为什么decltyp(*this)
为Foo&
而非Foo
似乎存在混淆。首先,考虑取消引用指针总是导致对指向对象的引用。
temp = *ptr // this would work if dereferencing returned by value or by reference
*ptr = expr // this would only work if dereferencing results in a reference.
现在decltype(expr)
始终为您提供与expr完全相同的类型。对于您*this
类型为Foo&
。
如果你想要没有它的类型扣除导致引用使用auto
而不是decltype
,那么:
auto copy(*this);
而不是
decltype(*this) copy(*this);
此外,我不知道为什么你的问题正在讨论移动建设,因为任何地方都没有动作。