我有这个函数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));
}
但关键是这样做是错误的,并且可能是未定义的行为。所以任何不好的事情都有可能发生(崩溃,甚至程序不小心做了你想做的事)。
如果你想遵守类型系统并避免违反不变量,就像反托拉斯的回答中建议的那样,做一个局部副本。当然,本地复制的成本可能会很高。