我写了这个简短的测试代码
# 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
?有某种优化吗?