Я не уверен, как даже изложить мой вопрос, но вот мы идем...
Итак, у меня есть этот класс, для которого 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
Может ли кто-нибудь сказать мне, почему это происходит?
У вас есть неопределенное поведение, потому что вы ничего не возвращаются из функции, которая имеет non- void
тип возвращаемого значения.
§6.6.3:
Вытекание конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.
§1.3.24:
неопределенное поведение
поведение, для которого настоящий международный стандарт не предъявляет никаких требований
emptyValue
?
Не такая большая головоломка. Ваш operator []
возвращает ссылку на некоторую переменную данных с именем emptyValue
.
m[100] = 200;
равносильно
m.emptyValue = 200;
Затем вы пишете cout << m [100];
что похоже на
cout << m.emptyValue;
Примечание: индекс "100" не имеет значения.
Нет ничего с этим:
#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;
}