Rvalue ссылки и шаблоны

70
14 января 2022, 15:50

К примеру имеется следующий код:

// main.cpp
#include <cstdlib>
#include <iostream>
#include <string>
 void foo(const std::string &t) {
  std::cout << "lvalue" << std::endl;
  std::cout << t << std::endl;
}
 void foo(std::string &&t) {
  std::cout << "rvalue" << std::endl;
  std::cout << t << std::endl;
}
int main() {
  std::string alpha = "tmp";
  foo(alpha);
  return EXIT_SUCCESS;
}

При выполнении которого мы ожидаемо увидим, что был использован первый вариант функции с константной ссылкой lvalue. Однако если функции заменить шаблонами:

// main.cpp
#include <cstdlib>
#include <iostream>
#include <string>
template <typename T>
void foo(const T &t) {
  std::cout << "lvalue" << std::endl;
  std::cout << t << std::endl;
}
template <typename T>
void foo(T &&t) {
  std::cout << "rvalue" << std::endl;
  std::cout << t << std::endl;
}
int main() {
  std::string alpha = "tmp";
  foo(alpha);
  return EXIT_SUCCESS;
}

То можно увидеть, что вызывается второй вариант функции с rvalue ссылкой. Почему? Как инстанцируются эти шаблоны?

PS конечно, можно добавить std::enable_if<std::is_rvalue_reference<T&&>::value>::type, но меня интересует почему так происходит.

Answer 1

В шаблонах && - это просто универсальная ссылка, которая может быть lvalue, может rvalue.

В первом случае без шаблонов нет rvalue переменной, только lvalue, потому и используется const-версия, принимающая lvalue.

Во втором - у нас переменная не является const, и используется вторая версия, которая может принять просто ссылку на строку, не константную, как более точное, не пребующее приведения типа сответствие.

READ ALSO
Замена изображения рабочего стола C++

Замена изображения рабочего стола C++

Пишу программу - шутник, меняющую фоновое изображение рабочего столаПроблема в том, что функция ставит вместо заложенного изображения

82
Ошибка Stack around the variable &#39;X&#39; was corrupted

Ошибка Stack around the variable 'X' was corrupted

Выдаёт Stack around the variable 'X' was corrupted(Ну и Y соответственно)

93
Не удается импортировать библиотеку

Не удается импортировать библиотеку

Запускаю следующий код:

119
Обход Bitmap по пиксельно

Обход Bitmap по пиксельно

Есть такой код сохранения скриншотаЕсть битмап и хотелось бы обойти его в цикле попиксельно

72