const virtual和virtual const有什么区别?

18

我看到C++中的某些函数被声明为

virtual const int getNumber();

但如果将函数声明为以下方式,有什么区别呢?

const virtual int getNumber();

这两者之间有什么区别?


3
注意,在这里 const 没有任何有用的作用。 - user541686
4个回答

34

正如已经提到的,它们没有区别。然而,请注意这两个确实有所不同:

virtual const int getNumber();
virtual       int getNumber() const;

在第一种方法中,const 指的是返回类型为 int 的返回值。
在第二种方法中,const 指的是调用该方法的对象;也就是说,在该方法内部,this 的类型为 T const *,你只能调用 const 方法、修改 mutable 字段等。

@TankorSmash 给答案添加了解释。 - lisyarus

21

没有区别。一个声明的修饰符通常可以以任何顺序书写。


通常情况下?你能想到一个例外吗? - ach
@AndreyChernyakhovskiy:我脑海中没有,但我不想说没有,因为我不能确定。如果您想自己检查,请阅读[dcl.spec]的所有15页。 - Mike Seymour
啊,我之前做过那个。所以当你说“通常”时,我就感到奇怪了。 - ach

10

没有任何区别。如果我们查看 decl-specifier-seq 的语法摘要,我们可以看到它以递归方式定义:

decl-specifier:
     类型说明符
decl-specifier-seq: decl-specifier decl-specifier-seq

唯一的限制是 constvolatile 可以与除它们自己以外的任何类型说明符组合使用(不允许使用 const constvolatile volatile 等),没有规定使用它们的顺序。


2
@anatolyg 这个问题没有具体说明语法或语义的区别,只是询问它们之间的差异。这个回答首先指出了它们没有区别,这是正确的,并通过一个从语法中提取的例子来支持这一点,这也是正确的。要使这个答案错误,就需要假设AST保留了限定符的顺序,然后对不同的顺序做出不同的反应,而任何这样的说法都需要有一些实际的证据来支持。 - user207421

2
没有区别。您可以按照自己喜欢的顺序应用修饰符。

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