gpt4 book ai didi

C++ const_cast 用法而不是 C 风格的转换

转载 作者:可可西里 更新时间:2023-11-01 18:04:49 27 4
gpt4 key购买 nike

为什么会这样?

  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 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/add const。相反,您复制 i0。对于该操作,根本不需要转换:

int i1 = i0;
const int i4 = i3;

您转换为的类型实际上应该是一个指针或引用。否则,使用 const_cast 没有意义,因为您可以直接复制它。例如,对于指针,您可以放弃 const,因为取消引用指针将为 const T* 产生另一种类型(产生 const T)而不是 T*(产生 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,以上内容可能会导致未定义的行为,您也可以写入它,然后产生未定义的行为)

关于C++ const_cast 用法而不是 C 风格的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com