【发布时间】:2011-05-21 23:46:54
【问题描述】:
根据标准(第 5.2.11 节),const_cast 会丢弃 cv 限定符(const 或 volatile)。
这是一个简单的例子。首先你声明两个函数接受一个指针和一个引用:
class Bar { ... };
void foo_ptr(Bar*);
void foo_ref(Bar&);
然后你创建一个对 const 的引用:
Bar b;
const Bar& cb = b;
然后您可以使用适当的 const_cast 调用任一函数:
foo_ptr(const_cast<Bar*>(&cb));
foo_ref(const_cast<Bar&>(cb));
这是我的问题:既然 const_cast 无法完成其他演员的设计目的,那么您要转换的内容不是很明显吗?换句话说,为什么语言不允许我简单地说:
foo_ptr(const_cast<>(&cb));
foo_ref(const_cast<>(cb));
我只能想到以下两个原因:
a) 当我尝试做一些疯狂的事情时,编译器应该阻止我,例如:
foo_ptr(const_cast<int*>(&cb));
foo_ref(const_cast<int&>(cb));
通过强迫我明确说明我要转换的类型可以防止我行为不端。我觉得这个(假设的)解释很弱,因为如果语言倾向于允许我写下错误的东西只是让编译器纠正我,那将是很奇怪的。
b) 如果变量既是 const 又是 volatile,则可能存在歧义。在这种情况下,编译器将无法判断我是否试图抛弃其中一个或另一个(或两者)。
这是为什么,还是有其他原因?
【问题讨论】: