Возьмем следующую функцию-член:Forwarding, реф классификаторы и функции-члены шаблонов
struct T {
template <typename X> void f(X&& x) { /* ... */ }
};
В этом случае x
является ссылкой переадресации, поскольку &&
используется для параметров функции внутри шаблона. Это так, как ожидалось.
Теперь возьмите эту функцию:
struct T {
template <typename X> void f(X&& x) && { /* ... */ }
};
Я бы ожидать, что this
будет рассматриваться таким же образом; в качестве справочника пересылки. Поэтому я ожидаю, что следующая программа для компиляции и запуска просто отлично:
#include <iostream>
struct T {
template <typename X>
bool operator<(X&& rhs) && {
std::cout << "&&" << std::endl;
return true;
}
};
int main() {
T t;
std::cout << (t < T()) << std::endl;
return 0;
}
Но с помощью GCC 4.8.4 и 6.0.1, это не так. Вместо этого, я получаю следующее:
rvalue.cpp: In function ‘int main()’:
rvalue.cpp:13:25: error: passing ‘T’ as ‘this’ argument of ‘bool T::operator<(X&&) && [with X = T]’ discards qualifiers [-fpermissive]
std::cout << (t < T()) << std::endl;
Казалось бы, что this
не сделал ссылку переадресации. Это правильно или ошибка? Должен ли this
рассматриваться как ссылка для пересылки? В какой части стандарта это указано?
@JoachimPileborg просто попробовал его с 6.0.1, тот же результат. Спасибо хоть! – OMGtechy