构造函数调用机制

Ada*_*erg 9 c++ constructor copy-constructor most-vexing-parse

struct my
{
   my(){ std::cout<<"Default";}
   my(const my& m){ std::cout<<"Copy";}
   ~my(){ std::cout<<"Destructor";}
};

int main()
{
   my m(); //1
   my n(my()); //2
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

1 ) Default
2 ) Copy
Run Code Online (Sandbox Code Playgroud)

实际产量:


我对构造函数调用机制的理解有什么问题?

Note 为简洁起见,我省略了头文件.

Pra*_*rav 11

情况1)

m被解释为函数返回my并且不带参数.要查看预期的输出删除()即使用my m;

案例2)

这被称为"最令人烦恼的解析".

n被解释为一个函数返回my,它接受一个类型指针的参数,返回my不带参数的函数.

要在这种情况下查看预期的输出,请尝试my n((my()));[而不是像前一种情况那样处理参数规范,编译器现在会将其解释为表达式,因为额外的()]

我的解释:

my n((my()))相当于my n = my().现在rvalue表达式my()创建一个临时的[即对默认构造函数的调用],并将n其复制初始化为该临时对象[由于某些编译器优化而无需调用copy-ctor ]

PS:我对答案的最后部分并不是100%肯定.如果我错了,请纠正我.

  • @MSalters:是的,我认为这是RVO的变种.:) (3认同)