在4.11.3节(第145页)中我们说过,const_cast 在重载函数的情景中最有用。举个例子,回忆6.3.2节(第201页)的shorterstring 函数:
//比较两个string对象的长度,返回较短的那个引用
const string &shorterString(const string &sl,const string &s2)
{
return sl.size()<= s2.size()?s1:s2;
}
这个函数的参数和返回类型都是const string的引用。我们可以对两个非常量的 string 实参调用这个函数,但返回的结果仍然是 const string 的引用。因此我们需要一种新的shorterstring函数,当它的实参不是常量时,得到的结果是一个普通的引用,使用const_cast可以做到这一点:
string &shorterString(string &sl,string &s2)
{
auto &r=shorterString(const_cast<const string&>(sl),
const_cast<const string&>(s2));
return const_cast<string&>(r);
}
在这个版本的函数中,首先将它的实参强制转换成对const的引用,然后调用了shorterstring函数的const版本。const版本返回对const string 的引用,这个引用事实上绑定在了某个初始的非常量实参上。因此,我们可以再将其转换回一个普通的string&,这显然是安全的。
const string &shorterString(const string &s1, const string &s2)
{
return s1.size() <= s2.size() ? s1 : s2;
}
string &shorterString(string &s1, string &s2)
{
auto &rs = shorterString(const_cast<const string &>(s1),
const_cast<const string &>(s2));
return const_cast<string &> (rs);
}
int main()
{
const string &ss1("123");
const string &ss2("1234");
const string &r1 = shorterString(ss1, ss2);
cout << r1 << '\n';
string s1("456");
string s2("45678");
string &r2 = shorterString(s1, s2);
cout << r2 << '\n';
system("pause");
return EXIT_SUCCESS;
}
输出:
123
456
《C++ Primer》 P209
标签:const,string,s2,C++,cast,引用,shorterString From: https://www.cnblogs.com/huvjie/p/18440154