我有这个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(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);
}
is:pass_by_const
有 const 参数std::string s
,因此不允许修改在封闭范围内定义并作为参数传递给他的字符串 s。但是,pass_by_non_const
允许修改 s。这会在编译时引发编译器错误。
但是,可以将 s 的本地非常量副本传递给pass_by_non_const
。然后,可以在 的范围内修改本地副本pass_by_non_const
,而作为参数传递给的封闭范围的 spass_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。
您甚至不应该调用from pass_by_non_const
,pass_by_const
因为如果参数是 const 引用,您“承诺”不会修改它。
如果你想违反类型系统(这是一件坏事),你可以做一些丑陋的事情,比如
pass_by_const(const std::string& s)
{
pass_by_non_const(const_cast<std::string&>(s));
}
但关键是这样做是错误的,并且可能是未定义的行为。所以任何不好的事情都可能发生(崩溃,甚至程序不小心做了你想做的事)。
如果您想遵守类型系统并避免违反不变量,请按照antitrust's answer中的建议制作本地副本。当然,制作本地副本可能会很昂贵。