При ответе на этот вопрос я натолкнулся на интересную разницу в разрешении перегрузки rvalue для ссылки между операторами-членами и операторами, не являющимися членами.
С учетом двух операторов, не являющихся членами, один передавая левый параметр как const, а другой как неконстантный, GCC 4.4.3 и MSVC2010 выбирают версию const при вызове с r-значением.
Однако, учитывая два оператора-члена, один const и один неконстантный, оба компилятора выбирают неконстантную версию.
Я предполагаю, что оба компилятора соответствуют этому стандарту, поэтому мне любопытно, почему существует такое расхождение между разрешением перегрузки const между членами и нечленами. Пожалуйста, просветите меня:)
Вот код, иллюстрирующий разницу:
#include <iostream>
class C {
public:
C(int i) { }
/*
C operator<<(C const &rhs) {
std::cout << "member non-const" << std::endl;
return *this;
}
C operator<<(C const &rhs) const {
std::cout << "member const" << std::endl;
return *this;
}
//*/
};
C operator<<(C &lhs, C const &rhs) {
std::cout << "non-member non-const" << std::endl;
return lhs;
}
C operator<<(C const &lhs, C const &rhs) {
std::cout << "non-member const" << std::endl;
return lhs;
}
int main() {
// Will print:
// "non-member const" when member operators are commented out
// "member non-const" when members are uncommented
C(5) << 6;
}