Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过非常量引用方法内部通过常量引用方法_C++_Compiler Errors_Constants_Const Correctness_Pass By Const Reference - Fatal编程技术网

C++ C++;通过非常量引用方法内部通过常量引用方法

C++ C++;通过非常量引用方法内部通过常量引用方法,c++,compiler-errors,constants,const-correctness,pass-by-const-reference,C++,Compiler Errors,Constants,Const Correctness,Pass By Const Reference,我有一个函数passbyconst(const-std::string&s),它想调用passbynon-const(std::string&s) 如果我有这个方法的定义 pass_by_const(const std::string& s) { pass_by_non_const(s); } 编译器会对我让步吗?有解决办法吗?我担心pass\u-by\u-non\u-const会在我背后修改。 pass_by_const(const std::string& s) {

我有一个函数
passbyconst(const-std::string&s)
,它想调用
passbynon-const(std::string&s)

如果我有这个方法的定义

pass_by_const(const std::string& s)
{
    pass_by_non_const(s);
}
编译器会对我让步吗?有解决办法吗?我担心
pass\u-by\u-non\u-const
会在我背后修改。

pass_by_const(const std::string& s)
{
    pass_by_non_const(s);
}
is:
pass\u by_const
具有常量参数
std::string s
,因此不允许修改在封闭范围中定义并作为参数传递给他的字符串s。但是,
pass\u by\u non\u const
可以修改s。这会在编译时引发编译器错误

但是,s的本地非常量副本可以通过非常量传递给
pass\u。然后,可以在
pass\u by\u non\u const
的范围内修改本地副本,而将封闭范围作为参数传递给
pass\u by\u const
则不会更改

编写该方法的正确方法是

pass_by_const(const std::string& s)
{
    std::string local_copy = s;
    pass_by_non_const(local_copy );
}
没有更多的编译时错误,本地拷贝可以在大多数内部作用域中修改,而封闭作用域中的s不会修改,这符合
pass\u by\u const
方法的pass-by-const ref属性。

pass_by_const(const std::string& s)
{
    pass_by_non_const(s);
}
is:
pass\u by_const
具有常量参数
std::string s
,因此不允许修改在封闭范围中定义并作为参数传递给他的字符串s。但是,
pass\u by\u non\u const
可以修改s。这会在编译时引发编译器错误

但是,s的本地非常量副本可以通过非常量传递给
pass\u。然后,可以在
pass\u by\u non\u const
的范围内修改本地副本,而将封闭范围作为参数传递给
pass\u by\u const
则不会更改

编写该方法的正确方法是

pass_by_const(const std::string& s)
{
    std::string local_copy = s;
    pass_by_non_const(local_copy );
}
不再有编译时错误,本地拷贝可以在大多数内部作用域中修改,而封闭作用域中的不会修改,遵循
pass\u by\u const
方法的pass by const ref属性。

您甚至不应该从
pass\u const
调用
pass\u by\u non\u const
,因为如果参数是常量引用,则“承诺”不会修改它

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

 pass_by_const(const std::string& s)
 {
    pass_by_non_const(const_cast<std::string&>(s));
 }
pass\u by\u const(const std::string&s)
{
通过非常量(常量铸造);
}
但关键是这样做是错误的,而且可能是错误的。所以任何不好的事情都可能发生(崩溃,甚至程序意外地做了你想做的事情)

如果要遵守类型系统并避免违反不变量,请按照中的建议制作一个本地副本。当然,制作本地副本可能成本高昂。

您甚至不应该从
pass\u by\u const
调用
pass\u by\u non\u const
,因为如果参数是常量引用,则“承诺”不修改它

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

 pass_by_const(const std::string& s)
 {
    pass_by_non_const(const_cast<std::string&>(s));
 }
pass\u by\u const(const std::string&s)
{
通过非常量(常量铸造);
}
但关键是这样做是错误的,而且可能是错误的。所以任何不好的事情都可能发生(崩溃,甚至程序意外地做了你想做的事情)


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

如果您的编译器允许这样做而没有任何警告,我会得到一个新的编译器。VC++允许将temp作为非常量引用传递,但即使这样,也会在.it上使用适当的(我认为是强制性的)警告级别进行警告。我只是想到处找工作。这只是一个方便的方式来要求更多的澄清。如果你的编译器允许这样做,而没有这么多的警告,我会得到一个新的编译器。VC++允许将temp作为非常量引用传递,但即使这样,也会在.it上使用适当的(我认为是强制性的)警告级别进行警告。我只是想到处找工作。这只是一个方便的方式来要求更多的澄清。我在我的工作中没有违反常量正确性,我仍然确保
pass\u by\u const
没有修改pass\u by const ref参数。@translation“我没有违反常量正确性”-你有。不:每个人都尊重它的承诺,pass by const ref方法将永远不被允许,并且能够修改参数,即使调用pass by non-const方法也是如此。如果non-const版本不修改任何内容,只需将代码移到const版本中,让non-const版本调用const版本即可。为什么这么难?如果一个函数不修改任何东西,它应该被声明为在
const
上工作,我在我的工作中没有违反const正确性,并且我仍然确保
pass\u by\u const
没有修改pass\u by const ref参数。@反托拉斯“我没有违反const正确性”-是的。否:每个人都尊重它的承诺,永远不允许使用pass by const ref方法,即使调用pass by non-const方法,也可以修改参数。如果non-const版本不修改任何内容,只需将代码移到const版本中,让non-const版本调用const版本即可。为什么这么难?如果一个函数不修改任何内容,它应该被声明为在
const