0

我有这个函数pass_by_const(const std::string& s)想要调用pass_by_non_const(std::string& s)C++ pass-by-const-reference方法传递const参考方法

如果我有这个方法的定义

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

将在我的编译器的产量,以及是否有变通?我担心pass_by_non_const会改变我的背后。

+0

如果你是编译器允许这个没有多少警告,我会得到一个新的编译器。 VC++允许将temps作为非const引用传递,但即使如此,警告级别也是适当的(并且在我看来是强制性的)。它确实是 – WhozCraig 2013-04-21 07:53:24

+0

。我只是想找到工作。这只是一个方便的方式来要求更多的澄清。 – octoback 2013-04-21 07:55:22

回答

3

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

会发生什么事是:pass_by_const具有常量参数std::string s,所以它不允许修改字符串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-ref-ness of the pass_by_const method。

3

你应该甚至不应该调用pass_by_non_constpass_by_const因为如果一个参数是一个const引用你是“有希望的”不修改它。

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

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

但问题是,这样做是错误的,可能是undefined behavior。所以任何不好的事情都可能发生(崩溃,甚至程序意外地做你想做的事)。

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

+0

我并没有在我的工作中违反const正确性,而且我仍然确保'pass_by_const'不会被const ref argment传递。 – octoback 2013-04-21 07:58:13

+1

@antitrust“我没有违反const的正确性” - **你这样做** – 2013-04-21 08:01:44

+0

否:每个人都尊重它的承诺,通过const ref方法永远不会允许并且能够修改参数,即使调用非pass const方法。 – octoback 2013-04-21 08:11:30