模糊度分辨率和右值/左值转换

时间:2018-01-09 10:57:59

标签: c++ copy-constructor move-semantics

我写了这个简短的测试代码

 # include <iostream>
 using std::cout;

struct P
{
  P()
   {cout << "I'm P::P()\n";};
  P(const P& p)
   {cout << "I'm P::P(const P&)\n";}
  P(P&& p)
   {cout << "I'm P::P(P&&)\n";}
};

int main()
{
  P pa, pe(pa);
  P pi((P(pa))), // this should be an object declaration
    pu(std::move(pa)); // as well as this one
  P po(P(pa)); // this is, instead, a function declaration
}

我得到了以下输出

I'm P::P()
I'm P::P(const P&)
I'm P::P(const P&)
I'm P::P(P&&)

我已经理解了第三行输出,它来自pi对象的实例化:为什么要调用复制构造函数而不是pu对象发生的移动构造函数?

P(pa)参数不应该是一个未命名的非const rvalue吗?如何绑定左值参考?或者第三行来自副本 构造函数实例化参数本身?在这种情况下,谁构建pi?有某种优化吗?

0 个答案:

没有答案