为什么这个编译没有错误? (返回一个不会对所述返回类型进行子类化的类型)

时间:2014-10-12 09:50:20

标签: c++ inheritance

我已继承std::list以允许随机访问'伪随机访问'使用[]运算符。

#include <list>
template <typename T>
class rlist : public std::list<T> {
    T& operator[](int index){
        typename std::list<T>::iterator iterator;
        int pos;
        for (iterator = this->begin(), pos = 0; iterator != this->end(); iterator++, pos++)
            if (pos == index)
                return *iterator;
        return inexistent_element();
    }

    class inexistent_element {

    };
};

inexistent_element尚未继承T,所以这不应该编译。但它编译。另外,我非常确定C ++不应该允许我通过非const引用传递一个内联创建的对象。

我使用Code :: Blocks IDE和MinGW gcc编译器。我想知道为什么这会编译。

2 个答案:

答案 0 :(得分:5)

您从未实例化成员函数operator[]。我怎么知道的?它是私人的。

请注意,实例化一个类不会自动实例化其成员函数([temp.inst] / 1):

  

类模板特化的隐式实例化导致   声明的隐式实例化,但不是   类成员函数的定义或默认参数,   成员类,作用域成员枚举,静态数据成员和   成员模板;

答案 1 :(得分:0)

显然,正如其他人所指出的,你从来没有真正实例化过 operator[];编译器不需要诊断没有合法的情况 实现是可能的,不同的编译器或多或少 积极进取。 (如果没有,MSC将几乎没有任何诊断 实例; g ++将诊断大多数没有合法的情况 实例化。)

但是,当然,您的功能可以合法实例化。 inexisting_element可能没有基类,但T可能有基类 非显式构造函数通过const引用获取inexisting_element,所以 在知道T之前,编译器不能合法地拒绝此代码;即 功能已经实例化。