将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;
};
我有两个疑问:
final
的方法是否与ABI兼容(对我来说这似乎是合理的,并且g++
的快速检查确认了),答案 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编译器则被迫发出虚拟调用呼叫。我不确定这是否会产生任何影响,但可能会有所不同。