在pass-by-const-reference方法内部的c++ pass-by-non-const-reference



我有这个函数pass_by_const(const std::string& s),它想调用pass_by_non_const(std::string& s)

如果我有这个方法的定义

pass_by_const(const std::string& s)
{
    pass_by_non_const(s);
}

将编译器屈服于我,有工作吗?我怕pass_by_non_const在我背后修改s

pass_by_const(const std::string& s)
{
    pass_by_non_const(s);
}

是:pass_by_const有const参数std::string s,所以不允许修改封闭作用域中定义的字符串s并作为参数传递给他。但是,pass_by_non_const允许修改s。这会在编译时引发编译器错误。

s的局部非const副本可以传递给pass_by_non_const。然后,局部副本可以在pass_by_non_const的作用域中被修改,而作为参数传递给pass_by_const的封闭作用域s不会被改变。

正确的方法是

pass_by_const(const std::string& s)
{
    std::string local_copy = s;
    pass_by_non_const(local_copy );
}

没有更多的编译时错误,local_copy可以在大多数内部作用域中被修改,而来自封闭作用域的s不会被修改,它遵守pass_by_const方法的pass-by-const-ref

你甚至不应该希望pass_by_const调用pass_by_non_const,因为如果参数是const引用,你"承诺"不修改它。

如果你想违反类型系统(这是一件坏事),你可以做一些难看的事情,比如

 pass_by_const(const std::string& s)
 {
    pass_by_non_const(const_cast<std::string&>(s));
 }
但关键是这样做是错误的,并且可能是未定义的行为。所以任何不好的事情都有可能发生(崩溃,甚至程序不小心做了你想做的事)。

如果你想遵守类型系统并避免违反不变量,就像反托拉斯的回答中建议的那样,做一个局部副本。当然,本地复制的成本可能会很高。

相关内容

最新更新