为什么MSVS允许NULL作为纯虚函数说明符?

时间:2015-10-08 15:53:30

标签: c++ visual-studio-2010 syntax pure-virtual function-declaration

考虑以下计划:

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?

3 个答案:

答案 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。因此,00Lnullptr都是NULL的有效实现。

您的Clang和GCC版本可能将其定义为0Lnullptr,而您的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在最新版本中修复了这个版本。