关于c ++中const_cast的问题

时间:2010-09-27 11:57:07

标签: c++ function reference casting

所有:    这是引自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可以添加常量,但看起来你必须强制转换为对象引用,这个引用的魔力是什么?

4 个答案:

答案 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引用。