string str1 = "abcd";string str2 = "acd";
const string &shorterstring(const string &string1, const string &string2)
{
return string1.size() < string2.size() ? string1 : string2;
}
string &shorter(string &str1, string &str2)
{
auto &str = shorterstring(const_cast(str1), const_cast(str2));
return const_caststr;
}
cout << shorter(str1, str2) << endl;
总是提示两个函数定义是非法的,为什么?
用法没对吧。
一般 const_cast(b);
表示把b的类型转换成a;
按照以下代码运行,输出acd;
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string str1 = "abcd"; string str2 = "acd";
const string &shorterstring(const string &string1, const string &string2)
{
return string1.size() < string2.size() ? string1 : string2;
}
string &shorter(string &str1, string &str2)
{
auto &str = shorterstring(const_cast<string&>(str1), const_cast<string&>(str2));
return const_cast<string&>(str);
}
int main()
{
cout << shorter(str1, str2) << endl;
return 0;
}
上面应该是
const_cast<a>(b);
const_cast(b);
一共四种cast。1、static_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,反过来也支持,但会给出编译警告,它作用最类似C风格的“强制转换”,一般来说可认为它是安全的;2、dynamic_cast,支持子类指针到父类指针的转换,并根据实际情况调整指针的值,和static_cast不同,反过来它就不支持了,会导致编译错误,这种转换是最安全的转换;3、reinterpret_cast,支持任何转换,但仅仅是如它的名字所描述的那样“重解释”而已,不会对指针的值进行任何调整,用它完全可以做到“指鹿为马”,但很明显,它是最不安全的转换,使用它的时候,你得头脑清醒,知道自己在干什么;4、const_cast,这个转换能剥离一个对象的const属性,也就是说允许你对常量进行修改。
const _ cast只能剥离一个对象的底层const(顶层const传参时会自动忽略)而参数是将非const转为const完全合法和安全,eg:
const constexpr int * i = 0;
int * j = const _ cast(i);//合法
constexpr int * i = 0;
int * j = i;//合法,顶层const忽略。
const_cast (expression)
发现不能编辑回答。上个回答竟然没有写完,重答一次。
const_cast转换符是用来移除变量的const限定符。它的用法是const_cast (expression),例如:
const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast(const_p);
const_cast只应该用在指针或者引用上。
在你的问题里,应该是
const_cast
const_cast转换符是用来移除变量的const限定符。它的用法是const_cast (expression),例如:
const int constant = 21;
const int* const_p = &constant;
int* modifier = const_cast(const_p);
const_cast只应该用在指针或者引用上。
在你的问题里,应该是
const_cast
改成这样就行了,去掉了auto
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string str1 = "abcd"; string str2 = "acd";
const string &shorterstring(const string &string1, const string &string2)
{
return string1.size() < string2.size() ? string1 : string2;
}
string &shorter(string &str1, string &str2)
{
const string & str = shorterstring(const_cast<string&>(str1), const_cast<string&>(str2));
return const_cast<string&>(str);
}
int main()
{
cout << shorter(str1, str2) << endl;
return 0;
}
auto &str = shorterstring(const_cast(str1), const_cast(str2));
这里的两个const_cast可以去掉;
return const_caststr;
这里改成return const_cast(str);
return const_caststr;
这里改成return const_cast(str);
const_cast是底层剥离的,如果参数是常量不可转换,就会复制一份,const_cast 返回的指针是指向另一个变量的。
如果参数可以转换,它就把参数的const 限定符移除,返回的指针就可以修改它的值。
const int a=1;
int * pa =const_cast (&a);
(*pa)++ ;
std::cout<< a << " " <<* pa<<std::endl;
int c=1;
const b = c;
int * pb =const_cast (&b);
(*pb)++ ;
std::cout<< b << " " <<* pb<<std::endl;
结果是:
1 2
2 2
你那里的参数传递不需要使用const_cast,string & 可以隐式转换成 const string &
还有,const_cast 是模版函数,要加一个