Re[3]: cref<> in<>
От: Sm0ke Россия ksi
Дата: 04.02.23 19:55
Оценка:
Здравствуйте, rg45, Вы писали:

S>>
S>>template <typename T>
S>>using cref = const T &;
S>>


R>Тут проблемка есть: при таком определении, cref<T> — не всегда константная ссылка, например:


R>http://coliru.stacked-crooked.com/a/308af58edc86d8bc

R>
  Код примера
R>
R>#include <iostream>

R>template <typename T>
R>using cref = const T &;

R>template <typename T>
R>cref<T> make_cref(T&& t) { return cref<T>(t); }

R>void test(const int& i) { std::cout << "Non-mutable: " << i << std::endl; }

R>void test(int& i) { std::cout << "Mutable: " << ++i << std::endl; }

R>int main()
R>{
R>    int i = 42;

R>    test(make_cref(i)); // -> Mutable: 43
R>}
R>



Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.
А вы его возвращаете из return и используете не по назначению.

Это просто чтобы не писать const type & — а для наглядности. Но какой в этом тогда смысл?
Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке.
Например зачем char передавать по конст ссылке?
Отредактировано 04.02.2023 19:56 Sm0ke . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.