и мне было интересно узнать причины, по которым почему-то pu sh (новый X) является проблемой?
Поскольку вы объявили тип параметра функции шаблона как неконстантное значение ссылка на T
. Чтобы помочь программистам избежать неправильного кода, язык не позволяет привязывать временные ссылки к неконстантным ссылкам. В вашем случае:
new X
возвращает временное значение типа X *
(указатель на X), тип аргумента функции шаблона T
в данном случае выводится на X *
, а t
теперь равно lvalue ссылка на X *
или X *&
, но язык не позволяет временно привязать ошибку компиляции ссылки lvalue. Ваш второй случай логически равен этому коду:
void pushX( X *&t ); // pushX accepts reference to pointer to X
pushX( new X ); // you cannot bind a temporary returned by `new X` to lvalue reference `t`
Это может быть легче понять, если вы используете простой тип, такой как int
:
int function_returns_int();
void push_int( int &ri );
push_int( function_returns_int() ); // compilation error, function_returns_int() returns temporary
Вы можете сделать свой код скомпилированным если вы храните указатель в переменной и делаете его временным:
int main() // main() must have return type int not void
{
int x = 3;
int &y = x;
push(x);
X *px = new X;
push(px);
push(y);
delete px;
}
, но, скорее всего, вы выбрали неверный тип для аргумента.
Подробная информация о ссылках и причинах передачи int &y
и почему t
не будет ссылкой на ссылку, в этом случае вы можете найти здесь
Примечание: ваш код, если вы его компилируете (изменив тип t
на const например) приведет к утечке памяти, но это выходит за рамки вашего вопроса