函数声明中virtual关键字的位置

3

在函数声明中,无论我是否将virtual关键字放在返回值类型之前还是之后,是否会有任何区别?

virtual void DoSomething() = 0;
void virtual DoSomething() = 0;

在重构一些遗留代码时,我发现了void virtual语法,我想知道它是否能够编译通过...


如果编译并按预期运行,那么我想它应该是有效的。你的问题应该是:这是编译器的怪癖还是符合标准的行为? - Skizz
有什么阻止你尝试的吗? - Rohit Vipin Mathews
我尝试了两种方法,没有看到任何区别。这并不意味着没有任何区别。 - Ronald McBean
4个回答

5

这两个语句是等效的。
但第一个语句更加传统。因为通常必填字段会被放在任何语法(例如你的示例中的函数原型)的最近处

virtual是一个可选关键字(虽然对于纯virtual来说是必需的)。然而返回类型(这里是void)是一个强制关键字,总是需要的。所以人们将virtual放在最左边,将return类型略微靠近函数签名。

另一个例子:出于同样的原因,我通常看到以下代码中第一个语法更受欢迎:

const int i = 0;  // 1
int const i = 0;  // 2

3

这两者没有区别,C++语法允许virtual关键字出现在返回类型前或后。通常习惯将其放在声明的第一位。


1

这两种格式都可以使用,但标准规定第一种格式。

参考资料:
C++03 7.1 规范符号

在声明中可以使用的规范符号有:

   decl-specifier:
         storage-class-specifier
         type-specifier
         function-specifier
         friend
         typedef

     decl-specifier-seq:
           decl-specifier-seqopt decl-specifier

而且,function-specifier 的更多解释在以下章节中:

7.1.2 函数说明符

函数说明符只能用于函数声明中。

 function-specifier:
     inline
     virtual
     explicit

但是标准并没有说明修饰符的顺序,对吗?因此,在标准中实际上没有定义使用这两种替代方案中的哪一种。 - Ronald McBean
@RonaldMcBean:是的,我在寻找特定的引用,但没有找到。 - Alok Save
“+1” 对于标准引号表示赞同。我不知道标准规定了我们通常认为理所当然的所有这些事情。 :0 - iammilind

-1

1
这并不是我的问题的答案。我知道如何正确地做,我想知道它是否有任何区别。 - Ronald McBean
这不是一个规则,只是编程实践。 - Rohit Vipin Mathews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接