Ссылка const forwarding выдает ошибку C2440: «инициализация»: невозможно преобразовать из «const std :: string» в «const std :: string &&» - PullRequest
6 голосов
/ 09 октября 2019

Следующее дает ошибку компилятора:

  #include <string>

  const std::string& get_name();

  int main(){
    auto&& name1 = get_name();//should bind to whatever
    const auto& name2 = get_name();//also ok
    const auto&& name3 = get_name();//<-not ok, why ?
    return 0;
  }

Ссылка на godbolt: https://godbolt.org/z/l6IQQ7

Если я использую const auto&, он компилируется - но это не будет привязывать к значению. auto&& будет привязан ко всему так, что, естественно, тоже работает. Однако какая логика const auto&& не обязательна в этом случае? Я знаю, что auto&& сохранит постоянство - но есть ли способ быть const явным и в то же время быть независимым от ссылки / значения ?

Мотивация:

Для «нормальной работы программирования» внутри функций и т. Д. Было бы здорово иметь возможность сказать что-то вроде: «Мне все равно, если это значение или ссылка - но я не изменяюэто для остальной части функции ".

Это должно быть возможно с учетом текущего языка.

Смежный вопрос: Почему добавление` const` делаетуниверсальная ссылка как значение

1 Ответ

5 голосов
/ 09 октября 2019

Для «нормальной работы программирования» внутри функций и т. Д. Было бы здорово иметь возможность сказать что-то вроде: «Мне все равно, является ли это значением или ссылкой - но я не изменяю его для остальной частифункция ".

У вас уже есть решение для вашей мотивации: используйте const auto&. const auto& будет привязан к:

  • const lvalue refs
  • lvalue refs
  • const rvalue refs
  • rvalue refs
  • Кроме того, это продлит срок жизни возвращаемых значений

, чтобы вы получили все, что вам нужно. Да, он отличается от const rvalue ref, но это не имеет значения, если вы просто используете его, так как вы все равно не сможете от него переместиться, поскольку он постоянный.

Последнее примечание: auto&& будетвсегда быть ссылкой. это ссылка для пересылки с вычетом, но ваша последняя переменная ВСЕГДА будет ссылкой (rvalue ref или lvalue ref, но никогда не будет "значением"). Может быть, это было / является заблуждением?

...