2010-02-24 42 views
14

我有这样的代码示例:铸造运营商 - 常量VS非const

class Number 
{ 
    int i; 
    public: 
    Number(int i1): i(i1) {} 
    operator int() const {return i;} 
}; 

什么是从铸造运营商移除const改性剂的影响? 它会影响自动投射,为什么?

回答

28

如果转换操作符是不是常量,你不能转换const对象:

const Number n(5); 
int x = n; // error: cannot call non-const conversion operator 
+1

+1 - 很好赚。嗯 - 我想转换从const对象中取得的值,但我不能,因为转换(即不修改源值)不是常量。停下来,看看,思考,推理是显而易见的 - 这与任何其他方法没有什么不同。但我仍然听到那个暮光之城的主题。源的(至少逻辑的)恒定性是该方法的预期行为的一部分 - “转换”意味着什么。但是再一次,一致的规则至少是一致的。 – Steve314 2010-02-24 10:46:47

5

无论class Number实例是否为const,都可以调用const版本。如果运算符被声明为非const,那么它只能在非常量实体上调用 - 当你试图在不能被调用的地方隐式地使用它时,你会得到一个编译错误。

+0

你的意思是“只在*非const *实体上调用?”? – legends2k 2010-02-24 11:00:51

+0

@ legends2k:是的,已修复。谢谢。 – sharptooth 2010-02-24 11:24:56

5

如果你有这样的功能:

void f(const Number& n) 
{ 
    int n1 = n; 
} 

它会开始,如果你给编译错误在cast操作符中删除const。