C++ 临时操作系统中成员和非成员运算符的常量重载选择的差异

C++ 临时操作系统中成员和非成员运算符的常量重载选择的差异,c++,operator-overloading,constants,C++,Operator Overloading,Constants,在回答这个问题时,我发现成员运算符和非成员运算符之间的rvalue to reference的重载解析有一个有趣的差异 给定两个非成员运算符,一个作为常量传递左参数,另一个作为非常量传递左参数,GCC 4.4.3和MSVC2010在使用右值调用时都选择常量版本 但是,给定两个成员运算符(一个常量和一个非常量),两个编译器都选择非常量版本 我假设这两个编译器都符合这方面的标准,所以我很好奇为什么成员和非成员之间的常量重载解析之间存在这种差异。请告诉我:) 下面是一些代码来说明区别: #includ

在回答这个问题时,我发现成员运算符和非成员运算符之间的rvalue to reference的重载解析有一个有趣的差异

给定两个非成员运算符,一个作为常量传递左参数,另一个作为非常量传递左参数,GCC 4.4.3和MSVC2010在使用右值调用时都选择常量版本

但是,给定两个成员运算符(一个常量和一个非常量),两个编译器都选择非常量版本

我假设这两个编译器都符合这方面的标准,所以我很好奇为什么成员和非成员之间的常量重载解析之间存在这种差异。请告诉我:)

下面是一些代码来说明区别:

#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;
}
#包括
C类{
公众:
C(int i){}
/*

C运算符右值不能绑定到对非常量的引用,因此只有对自由函数的常量重载的引用才是可行的:
运算符注意,标准中的一个特殊规则允许对类类型的临时变量调用非常量成员函数。在C++11中,可以使用
&
ref-qualifier.Nice,q轻松禁用uick回答,谢谢!我太习惯使用非成员运算符了,我忘了成员运算符使用这个(即,不是引用)作为他们的左撇子。@Xeo:谢谢-事实上,C++11有
这个
的ref限定符,尽管我不知道有任何编译器在这一点上实现了它们。@Kerrek:Clang 3.1至少有。:)另外,请看。确实没有
*这个
的“ref限定符”,这只是一个让人更容易理解的营销声明。