pass-by-const-reference方法中的C ++ pass-by-const-reference方法

时间:2013-04-21 07:46:54

标签: c++ compiler-errors const const-correctness pass-by-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会修改我的背后。

2 个答案:

答案 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中建议的本地副本。当然,制作本地副本可能会很昂贵。