9
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为简洁起见,我省略了头文件。

4

2 回答 2

11

情况1)

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

案例2)

这是众所周知的“最令人烦恼的解析”。

n被解释为一个函数返回my,它接受一个类型指针的参数,该指针返回my不接受任何参数的函数。

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

我的解释:

my n((my()))相当于my n = my()。现在右值表达式my()创建一个临时的[即对默认构造函数的调用],n并被复制初始化为该临时对象[由于一些编译器优化,没有调用 copy-ctor ]

PS:我不是 100% 确定我的答案的最后一部分。如果我错了,请纠正我。

于 2010-11-26T08:24:52.843 回答
1

像 Prasoon 一样,我怀疑 C++ 编译器正在以一种你意想不到的方式解析你的代码。例如,我认为它正在解析行

my m();

作为函数原型声明,而不是作为变量声明和对构造函数的调用 - 因此你看不到任何输出。

于 2010-11-26T09:18:50.647 回答