【问题标题】:why virtual void test()=00 is valid but virtual void test()=+0 and virtual void test()=-0 is not valid?为什么 virtual void test()=00 有效但 virtual void test()=+0 和 virtual void test()=-0 无效?
【发布时间】:2015-09-11 18:50:27
【问题描述】:

我搜索了一些关于虚函数声明的帖子,相信

=0

virtual void test()=0;

是固定的语法所以

virtual void test()=NULL;
virtual void test()=false;
virtual void test()=1-1;
virtual void test()=0.0;

其他声明应该是无效的。

但我找到了

virtual void test()=00;
virtual void test()=000;
virtual void test()=0000;

也可以编译,为什么?

还有,我认为整数+0和-0其实和0一样(我不确定是不是对的),就像00其实是0一样,为什么

virtual void test()=+0;

virtual void test()=-0;

无法编译?

【问题讨论】:

  • 如果 =00; 编译,请向编译器的开发人员提交错误。
  • gcc 4.9.2 在 ';' 之前正确报告“错误:无效的纯说明符(只允许 '= 0')令牌”。

标签: c++ syntax


【解决方案1】:

pure-specifier 是确切的标记序列 = 0 - 两个标记,=0,按此顺序排列。

不允许使用其他令牌。接受 =00 而没有(至少)警告的编译器是不合格的。

【讨论】:

    【解决方案2】:

    来自标准的November 2014 working draft

    10.4:

    通过使用纯说明符 (9.2) 来纯指定虚函数 在类定义的函数声明中。

    在 9.2 中我们看到了“纯说明符”的定义:

    纯说明符: = 0

    这表明您的示例不应该像您期望的那样编译,因此您应该向您的编译器制造商提交错误报告。

    【讨论】:

      【解决方案3】:

      在我看来,这仅仅是因为编译器(或一些预编译过程)正在用单个零替换一组零。例如,Excel 和 Calc.exe 将 0000 替换为 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 2016-04-20
        • 2017-12-23
        • 1970-01-01
        • 2018-03-02
        • 2018-11-18
        相关资源
        最近更新 更多