Search code examples
c++c++11binary-compatibility

Can the 'final' keyword be made conditional to C++11 in an API?


Is it a good idea to enable the final C++11 keyword conditionally to the standard version in a header file? I'm thinking of something like:

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

// ...

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

I have two doubts here:

  1. whether the method with and without final will be ABI-compatible (it seems reasonable to assume so to me, and a quick check with g++ confirms that),
  2. that the C++98 compiler won't complain when someone tries to override the method. But I believe that documenting the method as don't override it should handle this.

Solution

  • 1) final should never affect the ABI, it only affects whether the translation from C++ source code should succeed or fail, it has no required effect on the generated code.

    2) You can make the compiler complain even in C++98 mode if you are prepared to use some non-standard extensions. G++ 4.7 supports __final in C++98 mode with the same meaning:

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

    I think clang++ accepts final in C++98 mode, but issues a warning.