Здравствуйте, 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 передавать по конст ссылке?