怪异的输出:为什么这段代码会提供任何有意义的输出,更不用说这个了?

时间:2013-12-26 15:26:26

标签: c++ templates operator-overloading cout generic-programming

我不确定如何陈述我的问题,但我们走了......

所以,我有这个类operator[]有一个空体(尚未实现)。但是,当我从main()调用它时,它会产生一个输出。更重要的是,输出正是前一行中分配给它的输出。

EDIT:我添加了一个名为emptyValue的私有属性,并在类构造函数中将其初始化为TipVrijednosti()

以下是示例:

  template<typename TipKljuca, typename TipVrijednosti>
    class BinStabloMapa : public Mapa<TipKljuca, TipVrijednosti>
    {
            .
            .
        TipVrijednosti &operator[] (const TipKljuca &kljuc) {
            return emptyValue;
        }
        const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
            return emptyValue;
        }
            .
            .
    }

    int main()
    {
        BinStabloMapa<int, int> m;
        m[100] = 200;
        cout << m[100] << endl;
        return 0;
    }

    OUTPUT: 200

有人能告诉我为什么会这样吗?

3 个答案:

答案 0 :(得分:8)

您有未定义的行为,因为您没有从具有非void返回类型的函数返回任何内容。

§6.6.3:

  

离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。

§1.3.24:

  

未定义的行为
  本国际标准没有要求的行为

答案 1 :(得分:2)

不是一个很大的难题。您的operator []正在返回对名为emptyValue的某个数据变量的引用。

            m[100] = 200;

等同于

            m.emptyValue = 200;

然后你写                 cout&lt;&lt;米[100];

就像

            cout << m.emptyValue;

注意:索引'100'无关紧要。

答案 2 :(得分:0)

没有任何相关内容:

#include <iostream>
using namespace std;
template<typename TipKljuca, typename TipVrijednosti>
class BinStabloMapa /* : public Mapa<TipKljuca, TipVrijednosti> */ 
//comment inheritance to make it compile, not relevant to the problem
{
    //C++11 syntax, not relevant either
    TipVrijednosti emptyValue=TipVrijednosti();
    public:    
    TipVrijednosti &operator[] (const TipKljuca &kljuc) {
        return emptyValue;
    }
    const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
        return emptyValue;
    }


};

int main()
{
    BinStabloMapa<int, int> m;
    m[100] = 200; //calls no const operator[], thus emptyValue is changed 
    cout << m[100] << endl; //calls const operator[], thus emptyValue is return
    return 0;
}