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
为简洁起见,我省略了头文件。
答案 0 :(得分:11)
案例1)
m
被解释为函数return my
并且不带参数。
要查看预期输出,请删除()
,即使用my m;
案例2)
这被称为“最令人烦恼的解析”。
n
被解释为返回my
的函数,该函数接受类型指针的参数,返回函数返回my
,不带参数。
要查看此情况下的预期输出,请尝试my n((my()));
[不要像前一种情况那样将参数规范视为参数规范,编译器现在将其解释为表达式,因为额外的()
] < / p>
我的解释:
my n((my()))
相当于my n = my()
。现在rvalue表达式my()
创建一个临时的[即对默认构造函数的调用],n
被复制初始化为该临时对象[由于某些compiler optimization而没有调用copy-ctor ]
P.S :我对答案的最后部分并不是100%肯定。如果我错了,请纠正我。
答案 1 :(得分:1)
与Prasoon一样,我怀疑C ++编译器正在以您不期望的方式解析您的代码。例如,我认为它正在解析行
my m();
作为函数原型声明,而不是作为变量声明和对构造函数的调用 - 因此为什么你看不到输出。