Неконстантные ссылки не могут быть привязаны к значению r, что вы пытаетесь сделать с аргументом 9
для параметра DT &data
.
Вам также потребуетсяпередайте переменную, которая имеет значение 9
, или вам потребуется изменить аргумент (и член dataItem
, если это ссылка) на тип DT
, который копируется по значению в объект.Даже если вы измените ссылку на const
, чтобы избавиться от ошибки компилятора, у вас будет проблема с временем жизни передаваемого аргумента, если он временный (он не будет жить после вызова конструктора, поэтомуу вас останется свисающая ссылка).
Вот небольшой пример программы, которая демонстрирует проблему с привязкой константной ссылки в объекте к временному (значение int, возвращаемое из rand()
).Обратите внимание, что поведение не определено, поэтому оно может работать в некоторых условиях.Я тестировал эту программу с отладочными сборками на MSVC 2008 и MinGW 4.5.1:
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
template <class KF, class DT>
class BSTreeNode {
private:
KF key;
DT const& dataItem;
BSTreeNode* left;
BSTreeNode* right;
public:
BSTreeNode(KF sKey, DT const &data, BSTreeNode *lt, BSTreeNode *rt)
: key(sKey)
, dataItem(data)
, left(lt)
, right(rt)
{}
void foo() {
printf( "BSTreeNode::dataItem == %d\n", dataItem);
}
};
BSTreeNode<int, int>* test1()
{
BSTreeNode<int, int>* p = new BSTreeNode<int, int>(5,rand(), NULL, NULL);
// note: at this point the reference to whatever `rand()` returned in the
// above constructor is no longer valid
return p;
}
int main()
{
BSTreeNode<int, int>* p1 = test1();
p1->foo();
printf( "some other random number: %d\n", rand());
p1->foo();
}
Пример выполнения показывает:
BSTreeNode::dataItem == 41
some other random number: 18467
BSTreeNode::dataItem == 2293724