0

我有这个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。

4

2 回答 2

3

会发生什么

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。

于 2013-04-21T07:46:54.110 回答
3

您甚至不应该调用from pass_by_non_constpass_by_const因为如果参数是 const 引用,您“承诺”不会修改它。

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

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

但关键是这样做是错误的,并且可能是未定义的行为。所以任何不好的事情都可能发生(崩溃,甚至程序不小心做了你想做的事)。

如果您想遵守类型系统并避免违反不变量,请按照antitrust's answer中的建议制作本地副本。当然,制作本地副本可能会很昂贵。

于 2013-04-21T07:56:58.997 回答