考虑以下计划:
struct Test
{
virtual void foo()=NULL;
};
int main()
{ }
g ++ 4.8.1给出了如下预期错误:
[Error] invalid pure specifier (only '= 0' is allowed) before ';' token
Clang发出以下错误:
error: initializer on function does not look like a pure-specifier
但是当我在MSVS 2010上尝试它时,它会编译和放大运行正常。我认为g ++&在这种情况下,clang是对的。标准对此有何看法?我也使用\ Za命令行选项禁用了编译器扩展,但MSVS仍然接受该代码。为什么它没有给出任何错误?
我也在2015年7月8日上次更新的在线VC ++编译器here上尝试过。这是MSVS 2010中的错误吗? 2015?
答案 0 :(得分:2)
根据http://run.plnkr.co,[EnableCors("AllowPlnkr")]
[Route("api/[controller]")]
public class TrackerController : Controller
被定义为足以接近NULL
MSVC ++吞下的东西。就是这样。
在该代码之前尝试执行0
,它应该正确地破坏编译。
答案 1 :(得分:2)
NULL
被指定为实现定义的C ++空指针常量,它是一个求值为零的整数常量表达式或类型为std::nullptr_t
的prvalue。因此,0
,0L
或nullptr
都是NULL
的有效实现。
您的Clang和GCC版本可能将其定义为0L
或nullptr
,而您的MSVC版本将其定义为0
。在这种情况下,预处理器会将NULL
替换为0
,从而使您的程序格式正确。
答案 2 :(得分:1)
9.2
类成员部分中的语法说明如下:
[...]
member-declarator:
declarator virt-specifier-seqopt pure-specifieropt
[...]
pure-specifier:
= 0
^^^
因此纯粹的说明符必须是文字0
。对于MSVC,最有可能NULL
被定义为0
,但不必将其定义为0
,另一种可能性是0L
,这是语法不允许的,这是可能是gcc和clang使用的。
我们可以从18.2
部分看到这一点:
宏NULL是本国际标准194中实现定义的C ++空指针常量
脚注说:
可能的定义包括0和0L,但不包括(void *)0。
和第4.10
部分说:
空指针常量是一个整数文字(2.14.2),其值为零
排除了(void*)0
。
早期版本的clang和MSVC accepted other integer literals但看起来像clang在最新版本中修复了这个版本。