继承构造函数应该如何表现?

时间:2014-02-14 18:27:23

标签: c++11 gcc4.8

这个简单的代码产生一些意想不到的结果。至少对我来说......

#include <iostream>
class cls1
{
public:
    cls1(){std::cout << "cls1()" << std::endl;};
    cls1(int, int) : cls1() {std::cout << "cls1(int, int)" << std::endl;}
};

class cls2 : public cls1
{
public:
    using cls1::cls1;
    cls2() = delete;
};

int main()
{
    cls2 c();
    return 0;
}

我希望输出为:cls1(),因为cls2删除了默认构造函数,但代码不会输出任何内容,尽管它编译并运行正常。我正在使用GCC ver。 4.8.2。编译:

$ g++ -std=c++11 -g test.cpp

$ ./a.out

问题是:它应该如何表现?

谢谢!

1 个答案:

答案 0 :(得分:2)

您实际上并未在cls2中创建main()的实例;你声明一个返回cls2的函数。这是“最令人烦恼的解析”的一个例子。例如,请参阅http://en.wikipedia.org/wiki/Most_vexing_parse