我有以下代码,它在Visual C ++ 2012中编译。
for (Bar b : l) {
if (b instanceof Foo) {
System.out.println(((Foo)b).count.toString()); // This always gives 1.
} else {
System.out.println(b.count.toString()); // This always gives 0.
}
}
布尔'假'是否传递到字符串构造函数
instanceof
然后指针为空(因为false = 0)。为什么要编译,应该根据C ++ 11标准进行编译?
答案 0 :(得分:5)
MSVC错误地将false
视为空指针常量。但是,根据N4140,§4.10[conv.ptr] / 1(强调我的):
空指针常量是整数字面,其值为零 或者类型为std :: nullptr_t 的 prvalue。空指针常量可以是 转换为指针类型;结果是空指针值 该类型并且可以与对象的每个其他值区分开来 指针或函数指针类型。
措辞与C ++ 11略有不同,你可以find that discussion here。判决结果是在C ++ 11中也是一个错误。
根据[lex.icon] / 1的说法,对于可见性,TartanLlama在下面提供了“integer literal”的定义:
整数文字是一个没有句号或指数部分的数字序列,可选择分隔单引号,在确定其值时会被忽略。