所有: 这是引自Effective C ++ 3rd editiion
const_cast通常用于抛弃对象的常量。它是唯一能够做到这一点的C ++风格的演员。
我的问题是const_cast可以将constness添加到非const对象吗? 实际上我写了一个小程序试图批准我的想法。
class ConstTest
{
public:
void test() {
printf("calling non-const version test const function \n");
}
void test() const{
printf("calling const version test const function \n");
}
};
int main(int argc,char* argv){
ConstTest ct;
const ConstTest cct;
cct.test();
const_cast<const ConstTest&>(ct).test();//it is wrong to write this statement without the '&',why
}
省略'&amp;'发生以下错误:
错误C2440:'const_cast':无法从'ConstTest'转换为'const ConstTest'
它表明const_cast可以添加常量,但看起来你必须强制转换为对象引用,这个引用的魔力是什么?
答案 0 :(得分:7)
您不需要const_cast
来添加常量:
class C;
C c;
C const& const_c = c;
反过来需要const_cast
但
const C const_c;
C& c = const_cast<C&>(const_c);
但如果您尝试在c
上使用非const操作,则行为未定义。
顺便说一下,如果你不使用引用,那么就要制作一个对象的副本:
C d = const_c; // Copies const_c
答案 1 :(得分:3)
const_cast也可用于添加常量。
$5.2.11/3 - "For two pointer types T1 and T2 where
T1 is cv1 , 0 pointer to cv1 , 1 pointer to . . . cv1 ,n − 1 pointer to cv1 ,n T
and
T2 is cv2 , 0 pointer to cv2 , 1 pointer to . . . cv2 ,n − 1 pointer to cv2 ,n T
where T is any object type or the void type and where cv1 ,k and cv2 ,k may be different cv-qualifications, an rvalue of type T1 may be explicitly converted to the type T2 using a const_cast. The result of a pointer const_cast refers to the original object.
考虑:
int *t1 = NULL; // T = int, cv1, 0 = none
int * const t2 = const_cast<int * const>(t1); // T = int, cv2, 0 = const
根据上面的引用,上面很好,它增加了t
的常量但正如Herb Sutter所说,大部分时间都不需要明确地完成。
答案 2 :(得分:2)
const_cast
只能用于转换为指针和引用。它不能用于转换为对象。原因如下:如果你有一个const对象你不能使它成为非const,反之亦然 - 它已经是const,你不能重新声明它。您只能尝试通过指针或引用访问它而不使用(或使用)const。
答案 3 :(得分:1)
const_cast
无法修改值的常量。所以它返回一个值的const引用。