【问题标题】:What is the difference between const virtual and virtual const?const virtual 和 virtual const 有什么区别?
【发布时间】:2015-05-26 14:41:19
【问题描述】:

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

virtual const int getNumber();

但是如果函数声明如下有什么区别呢?

const virtual int getNumber();

这两者有什么区别?

【问题讨论】:

  • 请注意,const 在这里没有任何用处。

标签: c++ constants virtual


【解决方案1】:

如前所述,没有区别。但是,请注意这两个确实不同:

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

在第一种方法中,const指的是int类型的返回值。

在第二种方法中,const 指的是调用该方法的对象;也就是说,this 在此方法中将具有 T const * 类型,-您将只能调用 const 方法,仅修改 mutable 字段等等。

【讨论】:

  • @TankorSmash 为答案添加了解释
【解决方案2】:

没有区别。声明的说明符通常可以按任何顺序编写。

【讨论】:

  • 通常?你能想到一个例外吗?
  • @AndreyChernyakhovskiy:我没有想到,但我不想说没有,因为我不确定。如果您想自己检查,可以阅读所有 15 页的 [dcl.spec]。
  • 啊,前段时间我就这么做了。这就是为什么我想知道您何时说“通常”。
【解决方案3】:

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

decl 说明符:
     类型说明符

声明说明符序列:
     decl-specifier decl-specifier-seq

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

【讨论】:

  • @anatolyg 这个问题既没有指定语法也没有指定语义。它只是要求区别。这个答案首先说没有区别,这是正确的,并通过从同样正确的语法中提取来支持它。对于这个答案是错误的,有必要假设 AST 保留了说明符的顺序,然后对不同的顺序做出不同的反应,任何这样的说法都需要有一些实际证据的支持。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2013-07-12
    • 2010-10-27
    相关资源
    最近更新 更多