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

时间:2012-02-01 17:11:35

标签: c++ const

这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是const。通常当班级是帮助“自动化”某些程序时 例如:
Is this the OK scoped way to get random element from the container?
如果查看代码,很明显,如果更改传递给构造函数的容器,则以后类功能会被破坏。那么有没有办法让函数“需求”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);

}

5 个答案:

答案 0 :(得分:5)

声明但不实现非const版本。

int f(vector<int>& v);

尝试传递非const向量将被解析为此函数,然后您将收到链接器错误,因为不存在此类函数。

某些精美的模板游戏可能会将其变成编译时错误。

答案 1 :(得分:2)

没有办法保证这一点。如果你想确定对象没有改变,它应归类所有。实现这一目标的一种方法是将要保持不变的对象复制到类中,或者如果使用C ++ 11让构造函数采用rvalue-reference,则移动对象。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我不认为,这是可能的。

如果有可能,你仍然可以这样做

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

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

如果你想确定,没有人改变你的对象,你应该自己管理它。

答案 4 :(得分:0)

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

下一个例子说明了这一点。但是,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;
}