为什么不是所有现有的C++编译器都支持继承构造函数?

4

目前,G++和VC++ 2010都不支持继承构造函数。

然而,我认为这是C++0x中最美妙的特性之一。我认为编译器实现这个特性应该相对容易。

为什么编译器对这个特性不感兴趣呢?

假设我想通过继承std::string来设计自己的字符串类,就像这样:

class MyString : public std::string
{
public:
// I have to redefine many overloaded ctors here and forward their arguments to 
// std::string's ctors. How tedious it will be!!!
};

一个漂亮的代码示例:
struct B1 
{
   B1(char);
};

struct B2 
{
   B2(double);
   B2(int);
};

struct D1 : B1, B2 
{
   using B1::B1; //  D1(char)
   using B2::B2;  // D1(double), D1(int)
};

D1 d('c'); //OK, invokes D1(char)

“漂亮的代码示例”存在的问题:B2部分如何初始化D1? - UncleBens
@UncleBens,我认为它应该是默认初始化或未初始化。 - xmllmx
std::string 不应该被派生(或者其他任何STL容器)。 - fredoverflow
@FredOverflow,我只是用它作为一个例子。情景是通用的。 - xmllmx
@xmllmx:需要提供一个可访问的默认构造函数,但目前没有。 - Ben Voigt
2
既然你认为“编译器应该很容易实现”,为什么不编写一些针对g ++的代码呢? - Fred Nurk
5个回答

7
在C++0x中有很多新的材料,看起来gcc的志愿者们更喜欢先处理其他更有趣的变化。至于VC ++,除了工作的优先级外,还有额外的成本(微软产品经理博客上经常提到)需要满足要求、文档和非常广泛的测试,这些是销售产品所必需的部分,不仅仅是让它工作。最后,根据Stack Overflow上的讨论,C++0x委员会最近讨论削减此功能,因为约95%的用例都有简单的解决方法。综合考虑,我不惊讶编译器工程师们将此功能留待以后处理。

2

我认为你不会找到一个具体的理由,解释他们为什么还没有选择这个功能。一般的原则是,C++0x 中有很多其他的东西,编译器开发人员通常更愿意实现库特性而不是语言特性,尤其是当标准还没有完成并且语言特性可能会改变时。


1
相反地,许多库的更改直到语言支持到位后才能进行(如果语言特性发生变化,则库也必须更改)。 - Ben Voigt

2
  1. C++0x还不是一个标准。
  2. 他们没有足够的时间来实现它。
  3. 这并不像你想象的那样简单。仅仅调用这些构造函数是不够的。编译器需要在派生类中生成适当的构造函数,以便初始化派生类的成员。

1

现在是2012年3月,仍然没有编译器支持它。

可变参数模板构造函数可以很好地封装基类构造函数,并允许您重载某些构造函数。但对于多继承的情况可能不太适用。

class MyString: public std::string
{
public:
    template<class ...Args>
    MyString(Args... args): std::string(args...){}
};

对不起,Ben的答案已经链接到了这个解决方案。抱歉造成重复。 - goertzenator

0
编译器只会实现特定语言版本的功能。如果编译器声称支持C++0x,但不支持其所有功能,则是编译器的问题,请使用更好的编译器。
我认为你提到的编译器还没有实现C++0x。

1
目前为止,还没有编译器能够合理地实现完整的C++0x功能集。此外,C++0x标准尚未最终确定。它们正在逐步推出。 - In silico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接