Это:
typedef int& ref;
const ref error;
Не делает то, что вы думаете, что делает. Рассмотрим вместо этого:
typedef int* pointer;
typedef const pointer const_pointer;
Тип const_pointer
является int* const
, , а не const int *
. То есть, когда вы говорите const T
, вы говорите «создайте тип, в котором T неизменен»; поэтому в предыдущем примере указатель (не указатель) становится неизменным.
Ссылки не могут быть сделаны const
или volatile
. Это:
int& const x;
не имеет смысла, поэтому добавление cv-квалификаторов к ссылкам не имеет никакого эффекта.
Следовательно, error
имеет тип int&
. Вы не можете присвоить ему const int&
.
В вашем коде есть другие проблемы. Например, это, безусловно, неправильно:
template<class t>
t const& check()
{
return t(); //return a temporary object
}
То, что вы здесь делаете, возвращает ссылку на временный объект , срок действия которого заканчивается, когда функция возвращает . То есть, вы получите неопределенное поведение, если будете его использовать, потому что в рефранде нет объекта. Это не лучше чем:
template<class t>
t const& check()
{
T x = T();
return x; // return a local...bang you're dead
}
Лучшим тестом будет:
template<class T>
T check()
{
return T();
}
Возвращаемое значение функции является временным, поэтому вы все еще можете проверить, что вы действительно можете привязать временные ссылки к константным ссылкам.