繁体   English   中英

有没有办法声明该函数的输入参数必须是const reference?

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

这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是const。 通常,当该类是一个使某些过程“自动化”的助手时。
例:
这是从容器中获取随机元素的确定范围的方法吗?
如果您看一下代码,很明显,如果传递给构造函数的容器被更改,则类功能将被破坏。 因此,有一种方法可以使用函数“ 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);

}

声明但不实现非const版本。

int f(vector<int>& v);

尝试通过非常量向量的尝试将被解析为该函数,然后您将收到链接器错误,因为不存在此类函数。

一些精美的模板游戏可能能够将其转换为编译时错误。

没有办法保证这一点。 如果要确保对象不变,则该对象应归类所有。 一种实现方法是将要保持常数的对象复制到类中,或者使用C ++ 11让构造函数获取右值引用并移动对象。

如果希望类中的某些属性不受任何外部更改的影响,则应将它们由构造const TypeName _attr;复制到属性const TypeName _attr;

我不认为有可能。

如果有可能,您仍然可以那样做

Object mutable_;
const Object & notMutavle = mutable_;
func(notMutable);
mutable.change();

无论如何,即使const对象的状态也可以更改,如果它具有一些mutable字段。

如果要确保没有人更改对象,则应该自己进行管理。

您可以通过重载非常量引用的函数来实现。

下一个示例对此进行了演示。 但是,代替返回-1,f的第一个版本应该引发异常。

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM