“const_cast”,顶级常量和左值到右值的转换

`const_cast`, top-level const and lvalue-to-rvalue conversions

提问人:SomeoneWithPassion 提问时间:5/5/2023 最后编辑:SomeoneWithPassion 更新时间:5/5/2023 访问量:63

问:

假设我们有一段简单的代码,

int main() {
  int x = 5;
  int* const y = &x;
  const_cast<int*>(y);
}

我的假设是左值到右值的转换发生在表达式内部,以读取 的值是否正确?const_casty

如果是...那么,如果说它永远不能用于抛弃顶级限定符,因为它在左值到右值的转换过程中被隐式删除,这是否正确? 那么添加顶级常量限定符呢?我认为这是可能的,但是当我们做这样的事情时,我们真的会添加一个顶级常量吗?const_castconst

int main()
{
    int x = 5;
    int* y = &x;
    const_cast<int* const>(y);
}

...这显然不会将顶级 CONST 限定符添加到...我们可以隐式地对 const 指针的赋值做同样的事情。那么这需要什么呢?y

C++(英语:C++) 标准 隐式转换 常播

评论

0赞 fabian 5/5/2023
你确实意识到这是有效的,根本不需要。int* ptr = y;const_cast
0赞 dalfaB 5/5/2023
变量就是变量。变量具有类型。这是变量的类型。没有什么是永远不会改变的。变量的类型不能更改。
0赞 SomeoneWithPassion 5/5/2023
@fabian我意识到这一点。我只是在这里问一个不同的问题。

答:

3赞 HolyBlackCat 5/5/2023 #1

那么,如果说 const_cast 永远不能用于抛弃顶级常量限定符,因为它在左值到右值的转换过程中被隐式删除,这是否正确?

非正式地,“左值到右值转换”的意思是“读取对象的值”。

const_cast只有在投射到非引用时才需要这样做,所以投射到引用不会破坏它,我相信,所以恒常性不会被自动剥离。

另请注意,与标量不同,类和数组类型的 prvalues 可以是 const

那么添加顶级常量限定符呢?

当然,投射到 .请记住,表达式不能具有引用类型,因此返回 type 的顶级常量左值。const T &const_cast<const T &>(...)const T

当我们做这样的事情时,我们真的会添加一个顶级常量吗?const_cast<int* const>(y);

不,不是在这种情况下。您必须强制转换为引用。

评论

0赞 SomeoneWithPassion 5/5/2023
因此,在 const 中应该隐式剥离,因为 prvalues non class non reference types 不能有 cv。这是对的吗?const_cast<int* const>(y);
0赞 HolyBlackCat 5/5/2023
@SomeoneWithPassion Prvalues(以及一般的表达式)不能作为引用,您可能指的是非类非数组。否则是的。
0赞 SomeoneWithPassion 5/5/2023
呜,错别字。这正是我的意思。谢谢!