'final'关键字是否可以在API中以C ++ 11为条件?

时间:2012-08-12 22:35:45

标签: c++ c++11 binary-compatibility

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. 使用和不使用final的方法是否与ABI兼容(对我来说这似乎是合理的,并且g++的快速检查确认了),
  2. 当有人试图覆盖该方法时,C ++ 98编译器不会抱怨。但我相信将方法记录为不会覆盖它应该处理这个问题。

2 个答案:

答案 0 :(得分:3)

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

2)如果您准备使用某些非标准扩展,即使在C ++ 98模式下,您也可以使编译器抱怨。 G ++ 4.7在C ++ 98模式下支持__final,具有相同的含义:

#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 ++在C ++ 98模式下接受final,但会发出警告。

答案 1 :(得分:1)

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