2016-12-04 107 views
0

这是我的代码。这运行,但它给我一个错误,当我从ostream &运营商< <删除常量。为什么?为什么运算符<<需要const?

作为一个侧面问题,显示的错误消息是:不能将'std :: ostream {aka std :: basic_ostream}'左值绑定到'std :: basic_ostream & &'。这是如何表明我错过了一个const?

#include <iostream> 

using namespace std; 

class pair_int{ 
public: 
    int x; 
    int y; 
    pair_int(int x, int y):x(x),y(y){}; 
    friend ostream& operator<< (ostream & s, pair_int & c); 
}; 
ostream& operator<<(ostream & s, const pair_int & c){ 
    s << c.x; 
    s << ","; 
    s << c.y; 
    return s; 
} 
pair_int square(int x){ 
    return pair_int(x, x*x); 

} 
int main(int argc,char * argv []){ 
    int x; 
    cin >> x; 
    cout << square(x); 

    return 0; 
} 
+0

1.4.3的对象不应该改变的对象的内容,因此,对象正在输出是恒定的或'const'。 –

+1

否则您无法通过临时实例吗? –

+0

请参阅http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to-a-temporary-object – juanchopanza

回答

2

因为调用square()的结果是一个r值,其可以结合到一个const 1-值引用或r值参考,但不是一个可变1-值参考。

这是设计用来防止您意外创建临时设备,然后您可以进行变异并丢弃而没有意义。

(不适用于违规Microsoft编译)

+0

它适用于其他规则破解编译器吗? :) :) –

+0

@RSahu我不知道有任何其他公司试图通过拒绝遵守国际贪婪标准来阻止创新,但是如果你把它们引起我的注意,我会高兴地将它们召唤出来。 –

+0

不幸的是,我不知道有任何其他公司。我每天都在使用MS编译器。疼痛打击了我的家。 –