提问人:SomeoneWithPassion 提问时间:5/5/2023 最后编辑:SomeoneWithPassion 更新时间:5/5/2023 访问量:63
“const_cast”,顶级常量和左值到右值的转换
`const_cast`, top-level const and lvalue-to-rvalue conversions
问:
假设我们有一段简单的代码,
int main() {
int x = 5;
int* const y = &x;
const_cast<int*>(y);
}
我的假设是左值到右值的转换发生在表达式内部,以读取 的值是否正确?const_cast
y
如果是...那么,如果说它永远不能用于抛弃顶级限定符,因为它在左值到右值的转换过程中被隐式删除,这是否正确?
那么添加顶级常量限定符呢?我认为这是可能的,但是当我们做这样的事情时,我们真的会添加一个顶级常量吗?const_cast
const
int main()
{
int x = 5;
int* y = &x;
const_cast<int* const>(y);
}
...这显然不会将顶级 CONST 限定符添加到...我们可以隐式地对 const 指针的赋值做同样的事情。那么这需要什么呢?y
答:
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
呜,错别字。这正是我的意思。谢谢!
评论
int* ptr = y;
const_cast