Const对象作为函数形参
const objects as a function parameter
考虑以下代码片段:
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上尝试了GCC(4.8.2)和Clang(3.4)与-Wall -std=c++11
,结果是相同的(没有错误/警告)。我还搜索了"c++ const对象函数",但没有得到任何看起来有希望的东西。
这是完全正常的。该对象在函数中被视为const
;它不是最初创建为不可变的,这并不重要。
当然,相反的是不正确的!
void foo(T& rarr);
int main()
{
const T lolwut;
foo(lolwut); // oops
}
const
禁止函数体修改参数变量。这两种方法都可以编译,因为您没有尝试修改它。
可以重载const
和非const
引用形参,只有当实参确实是const
(或者类型转换导致传递临时类型)时,才会选择const
重载。(对于非引用形参,const
很少有意义,甚至可能没有定义这种重载)
在这种情况下,const
所做的就是防止修改参数变量(并且在类的情况下,防止调用未标记为const
的函数)。MyClass
可以被简单地转换为const MyClass
,因为你可以对const MyClass
做任何你不能对非const
做的事情。当然,反过来就不成立了。
(我在上面说"应该",因为如果你想的话,当然有可能在c++下完全颠覆const
语义,所以函数原型中const
的存在实际上只是一个有希望的提示,而不是一个铸铁的编译器强制的保证。)但是任何一个明智的程序员都不应该破坏这样的东西!)
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 将函数形参的实参解包到c++模板类
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- 关于将指向数组的指针作为函数形参的混淆
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 作为函数形参传递的Vector初始化器列表
- 指向函数形参的指针vs函数形参
- 在模板化类和函数上下文中以默认值作为函数形参的函子:-)
- 带std::函数形参的重载操作符
- 作为Const引用的函数形参
- Const对象作为函数形参
- 函数形参中的指针
- 使用关键字作为C函数形参或c++模板参数
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
- 模板类复制构造函数形参,带或不带模板实参
- c++中函数形参中的右值引用