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%肯定.如果我错了,请纠正我.