Виведені оператори конверсії повернутої вартості трохи дивні. Але основна ідея полягає в тому, що вона діє як параметр функції, щоб вибрати, який з них використовувати.
І при виборі між T&&
і T&
на T&
перемоги в правилах дозволу перевантаження. Це дозволить:
template<class T>
void f( T&& ) { std::cout << "rvalue"; }
template<class T>
void f( T& ) { std::cout << "lvalue"; }
працювати. T&&
може відповідати рівню lvalue, але коли наявні як значення lvalue, так і універсальні еталонні перевантаження, переважніше значення lvalue.
Можливо, правильний набір операторів перетворення:
template <typename T>
operator T&&() &&;
template <typename T>
operator T &() const; // maybe &
або навіть
template <typename T>
operator T() &&;
template <typename T>
operator T &() const; // maybe &
щоб запобігти покусі вас невдале продовження терміну служби.
3 Типи, що використовуються для визначення впорядкування, залежать від контексту, в якому здійснюється часткове замовлення:
[SNIP]
(3.2) У контексті виклику функції перетворення використовуються типи повернення шаблонів функцій перетворення.
Потім закінчується залежно від "більш спеціалізованих" правил під час вибору перевантажень:
(9.1) якщо тип із шаблону аргументу був еталонним значенням і тип з шаблону параметра не був, тип параметра не вважається принаймні таким же спеціалізованим, як тип аргументу; інакше,
Таким чином , operator T&&
не по крайней мере спеціалізовані , як operator T&
, між тим немає правил держави operator T&
не є , принаймні , як спеціалізована operator T&&
, тому operator T&
більш спеціалізовані , ніж operator T&&
.
Більш спеціалізовані шаблони виграють роздільну здатність перевантаження над меншим, а все інше рівним.