2

final在头文件中对标准版本有条件地启用 C++11 关键字是个好主意吗?我在想类似的东西:

#if __cplusplus >= 201103L
#   define MY_FINAL final
#else
#   define MY_FINAL
#endif

// ...

class Derived : public Base
{
public:
    virtual int f() MY_FINAL;
};  

我在这里有两个疑问:

  1. 有和没有的方法是否与finalABI 兼容(对我来说假设是合理的,并且快速检查g++证实了这一点),
  2. 当有人试图重写该方法时,C++98 编译器不会抱怨。但我相信将方法记录为不覆盖它应该可以处理这个问题。
4

2 回答 2

3

1)final不应该影响 ABI,它只影响从 C++ 源代码的翻译是成功还是失败,它对生成的代码没有必要的影响。

2) 如果您准备使用一些非标准扩展,即使在 C++98 模式下也可以让编译器报错。G++ 4.7 支持__finalC++98 模式,含义相同:

#if __cplusplus >= 201103L
#   define MY_FINAL final
#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
#   define MY_FINAL __final
#else
#   define MY_FINAL
#endif

我认为 clang++final在 C++98 模式下接受,但会发出警告。

于 2012-08-13T20:33:16.967 回答
1

#2是相当给定的。不过,我不太确定#1。从逻辑上讲,C++11 编译器完全有权f()对 Derived 对象进行内联调用,例如,不发出虚拟调用,而 C++03 编译器则被迫发出虚拟调用。我不确定这是否真的会产生任何影响,但它可能会。

于 2012-08-12T22:42:54.370 回答