请考虑以下代码段:
class MyClass {
int x;
public:
MyClass(int val) : x(val) {}
const int& get() const {return x;}
};
void print (const MyClass& arg) {
cout << arg.get() << '\n';
}
int main() {
MyClass foo (10);
print(foo);
return 0;
}
无论我是否在MyClass的实例化之前添加const
修饰符,程序都会成功编译(没有任何警告)并打印10
。为什么print
可以接受非const
参数?或者,换句话说,函数参数中const
修饰符的功能是什么?为什么函数的形式和实际参数可以有不同的类型(或修饰符)?
我在Ubuntu 14.04上用-Wall -std=c++11
尝试了GCC(4.8.2)和Clang(3.4),结果相同(没有错误/警告)。我也搜索过“c ++ const对象函数”,但没有得到任何看起来很有希望的东西。
答案 0 :(得分:2)
这是完全正常的。该对象在您的函数中被视为const
;它并不是最初被创建为不可变的。
当然,事实恰恰相反!
void foo(T& rarr);
int main()
{
const T lolwut;
foo(lolwut); // oops
}
答案 1 :(得分:0)
const
禁止函数体修改参数变量。两种方式都可以编译,因为您没有尝试修改它。
您可以重载const
和非const
引用参数,只有在参数确实为const
时才会选择const
重载(或类型转换结果)在临时通过)。 (对于非参考参数,const
很少有意义,甚至可能无法定义此类重载。)
答案 2 :(得分:0)
在这种情况下const
所做的就是阻止修改参数变量(在类的情况下,阻止调用未标记为const
的函数)。 MyClass
可能会被轻视为const MyClass
,因为对于const MyClass
,您无法对{ - 1}}做任何事情。当然,情况恰恰相反。
(我说&#34;应该&#34;上面,因为如果你愿意的话,当然可以完全颠覆C ++下的const
语义,所以函数中存在const
原型实际上只是一个有希望的暗示而不是铸铁编译器强制保证。但没有明智的程序员应该破坏这样的东西!)