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
}
预期输出:
1 ) Default
2 ) Copy
实际输出:
我对构造函数调用机制的理解有什么问题吗?
Note
为了简洁起见,我省略了头文件。
Case 1)
m
被解释为函数返回my
并且不接受任何争论。
要查看预期的输出,请删除()
即使用my m;
Case 2)
这就是众所周知的“最令人烦恼的解析”。
n
被解释为函数返回my
它接受一个指向函数返回的指针类型的参数my
不接受任何争论。
要查看这种情况下的预期输出,请尝试my n((my()));
[编译器不再像前一种情况那样将其视为参数规范,而是将其解释为表达式,因为额外的()
]
我的解读:
my n((my()))
相当于my n = my()
。现在是右值表达式my()
创建一个临时的[即对默认构造函数的调用]并且n
复制是否初始化为该临时对象[由于某些原因,没有调用复制向量编译器优化 https://stackoverflow.com/questions/4286301/why-isnt-the-copy-constructor-called-here/4286330#4286330]
P.S:我对我的答案的最后部分不是100%确定。如果我错了请纠正我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)