【发布时间】:2012-01-10 16:33:18
【问题描述】:
为什么会编译:
class Bar {};
int main() {
Bar i;
Bar *b = &i;
typedef const Bar& type;
type t = type(b);
}
G++(4.5,4.7 个快照)、Comeau 和 MSVC 都很高兴,但警告未使用的变量。
编译器认为这意味着什么?是UB吗?为什么不是错误?
我认为这应该是一个错误,因为我不小心将Bar* 变成了const Bar&,而没有取消引用或疯狂转换。我认为这一切都是完全安全的。
【问题讨论】:
-
请将其缩减为最小代码,例如从
const type t中删除const。 -
也许你也应该写下为什么你认为它应该是一个错误?
-
我明白了:
warning: dereferencing type-punned pointer will break strict-aliasing rules。而更合适的const type t(b);确实是个错误。但你是对的,为什么会自动取消引用? -
@ronag: 很明显,你不能从
Bar*初始化Bar const&。const type也不应该存在,但我认为const无论如何都会被类型别名忽略。 -
@AzzA:这是一个毫无意义且无益的断言。
标签: c++