ошибка: C2440 ‘return’: не удается преобразовать из ‘int’ в T

#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; ) .