有没有办法声明函数的输入参数必须是常量引用

Is there a way to declare that input parameter of the function must be const reference?

本文关键字:常量 引用 参数 输入 声明 函数 有没有      更新时间:2023-10-16

这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是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;
}