9

为什么会出现以下情况?:

  const int i0 = 5;
//int       i1 = const_cast<int>(i0);       // compilation error
  int       i2 = (int)i0;                   // okay

  int       i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
  const int i5 = (const int)i3;             // okay
4

4 回答 4

21
  const int i0 = 5;
//int       i1 = const_cast<int>(i0);       // compilation error
  int       i2 = (int)i0;                   // okay

  int       i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
  const int i5 = (const int)i3;             // okay

编译错误是因为您没有将 const 丢弃/添加 const。相反,您复制 i0。对于该操作,根本不需要强制转换:

int i1 = i0;
const int i4 = i3;

您转换为的类型实际上应该是指针或引用。否则,使用 const_cast 没有意义,因为您可以直接复制它。例如,对于指针,您可以抛弃 const,因为取消引用指针会为 a const T*(yields const T) 产生另一种类型,而不是 a T*(yields T)。对于引用,同样如此:T&将使用另一种this指针类型而不是使用const T&. 现在您真正想要归档的内容:

  const int i0 = 5;
//int &     i1 = const_cast<int&>(i0);      // okay (but dangerous)
  int &     i2 = (int&)i0;                  // okay (but dangerous)

  int       i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
  const int&i5 = (const int&)i3;             // okay too!

以上可能导致未定义的行为,当您通过对非 const 的引用写入原始 const 对象时(实际上,仅转换和读取它本身并不是未定义的行为。但是如果您要丢弃 const,您可能也写入它,然后产生未定义的行为)

于 2008-12-16T06:36:12.103 回答
5

这是一个错误,因为标准说这是不允许的。该标准列举了const_cast允许进行的转换类型,并且不允许任何不在列表中的转换。它允许以下操作:

  • 指针
  • 参考
  • 成员指针

由于您的类型不是其中任何一种,因此它们是不允许的。

从好的方面来说,您提供的示例也不需要 const_cast

于 2008-12-16T07:01:08.887 回答
0

对于第一个错误。const_cast 只能用于指针或引用类型。“int”两者都不是。这可能是也可能不是 C++ 标准(找不到好的参考)。但是对于某些实现,例如 MS 的 C++ 编译器,情况就是如此。

对于第二个错误。const_cast 只能用于删除 const 或 volatile 限定符,不能添加它。

参考: http: //msdn.microsoft.com/en-us/library/bz6at95h (VS.80).aspx

于 2008-12-16T06:35:43.680 回答
0

根据CPP Reference,结果必须是指针或引用。使用指针时,输入也需要是指针。对于引用,您可以将变量作为输入,并将引用作为输出。该页面说:

任何类型 T 的左值都可以转换为对相同类型 T 的左值或右值引用,或多或少是 cv 限定的。同样,类类型的纯右值或任何类型的 xvalue 都可以转换为或多或少有 cv 限定的右值引用。

意义

/* lvalue can be converted to lvalue or rvalue references  */
int& test1 = const_cast<int&>(var);   // lvalue to l-ref; same works for class type
int&& test2 = const_cast<int&&>(var); // lvalue to r-ref; same works for class type
/* prvalues: restriction on built-in types to allow some compiler optimization */
//int&& test5 = const_cast<int&&>(1);            // prvalue of built-in not allowed
A&& test6 = const_cast<A&&>(A());                // prvalue of class type allowed
/* xvalue can be converted to rvalue references */
int&& test8 = const_cast<int&&>(std::move(var)); //xvalue of built-in
A&& test8 = const_cast<A&&>(std::move(A()));     // xvalue of class
于 2020-07-19T19:48:31.050 回答