有没有办法声明函数的输入参数必须是常量引用
Is there a way to declare that input parameter of the function must be const reference?
这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是const。通常,当类是"自动化"某些过程的帮助程序时
示例:
这是从容器中获取随机元素的OK范围的方法吗
如果您查看代码,可以清楚地看到,如果传递给构造函数的容器被更改,则稍后类功能将被破坏。那么,有没有一种方法可以让函数"demand"const而不是"promise"const。
示例:
int f(const vector<int>& v)
{
return v.size();
}
int main()
{
vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
cout << f(v);
}
声明但不实现非常量版本。
int f(vector<int>& v);
传递非常量向量的尝试将被解析为此函数,然后您将得到一个链接器错误,因为不存在这样的函数。
一些花哨的模板游戏可能会把它变成编译时的错误。
没有办法保证这一点。如果您想确保对象不会更改,那么它应该归类所有。实现这一点的一种方法是将要保持常量的对象复制到类中,或者如果使用C++11让构造函数获取右值引用,则移动对象。
如果您希望类内的某些属性不受任何外部更改的影响,则构造函数应将它们复制到属性const TypeName _attr;
。
我认为这是不可能的。
如果可能的话,你仍然可以像一样
Object mutable_;
const Object & notMutavle = mutable_;
func(notMutable);
mutable.change();
无论如何,即使是const
对象的状态也可能被更改,如果它有一些mutable
假动作的话。
如果你想确保没有人更改你的对象,你应该自己管理它。
您可以通过重载函数进行非常量引用来实现这一点。
下一个示例演示了这一点。但是,f的第一个版本应该抛出一个异常,而不是返回-1。
#include <vector>
#include <iostream>
int f(std::vector<int>& )
{
return -1;
}
int f(const std::vector<int>& v)
{
return v.size();
}
int main()
{
std::vector<int> v;
v.push_back(42); // can f be changed to reject v because it is not const
std::cout << f(v)<<std::endl;
const std::vector<int> cv(5);
std::cout << f(cv)<<std::endl;
}
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?