#c #c 17
#c #c 17
Вопрос:
Я получаю эту ошибку как на VS2017, так и на g , при компиляции с соблюдением C 17. Кто-нибудь может объяснить?
template<typename T>
T doit(Tamp;amp; arg) {
int result{ arg * 2 };
return resu< // works
// return arg; // works
// return arg*2; // error: C2440 'return': cannot convert from 'int' to T
}
int main() {
int i {42};
cout << doit(i) << endl;
return 0;
}
Комментарии:
1. Вы пропустили важную информацию
[with T = intamp;]
. Временное r-значениеarg*2
не может быть присвоено непостоянной ссылке. Такжеreturn result
не работает, хотя выглядит как рабочий, это неопределенное поведение, возвращает ссылку на локальную переменную после завершения ее области видимости.
Ответ №1:
typename T
может быть ссылочным типом.
std::remove_reference<T> doit(Tamp;amp; arg) {
должно решить эту проблему, поскольку она заставляет оператор return копировать, вместо того, чтобы потенциально пытаться привязать r-value ( Tamp;amp;
) к ссылке l-value ( Tamp;
) .