构造函数调用机制

时间:2010-11-26 08:22:51

标签: 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
}

预期产出:

1 ) Default
2 ) Copy

实际输出:


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

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

2 个答案:

答案 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();

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