我有这个函数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
会修改我的背后。
答案 0 :(得分:3)
会发生什么
pass_by_const(const std::string& s)
{
pass_by_non_const(s);
}
是:pass_by_const
具有const参数std::string s
,因此不允许修改封闭范围中定义的字符串并将其作为参数传递给他。但是,pass_by_non_const
允许修改s。这会在编译时引发编译器错误。
然而,s的本地非const副本可以传递给pass_by_non_const
。然后,可以在pass_by_non_const
的范围内修改本地副本,而不会更改作为pass_by_const
的参数传递的封闭范围。
然后
编写该方法的正确方法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-ness。
答案 1 :(得分:3)
你甚至不应该希望从pass_by_non_const
调用pass_by_const
,因为如果一个参数是一个const引用,你“承诺”不修改它。
如果你想违反类型系统(这是一件坏事),你可以做一些丑陋的事情,比如
pass_by_const(const std::string& s)
{
pass_by_non_const(const_cast<std::string&>(s));
}
但重点是,这样做是错误的,可能是undefined behavior。所以任何不好的事情都可能发生(崩溃,甚至程序意外地做你想做的事情)。
如果您想遵守类型系统并避免违反不变量,请制作antitrust's answer中建议的本地副本。当然,制作本地副本可能会很昂贵。