有没有理由在工会中使用最终说明符?

时间:2016-10-15 20:09:44

标签: c++ c++11

最终说明符可以与类或结构一起使用,以禁止从它们继承。在这种情况下,我们只需要将我们的类/结构标记为final

class Foo final {
    // ...
};

更有趣的是,相同的语法对于联盟有效:

union Foo final {
    // ...
};

来自cpp.reference.com

  

final也可以与联合定义一起使用,在这种情况下它具有    自工会以来没有影响(除了对std :: is_final的结果)    不能来自)

看起来最终说明符与联盟的使用是荒谬的。如果是这样,为什么甚至可以将工会标记为最终?只是为了一致性?或者有关 type_traits 的一些内容?我是否遗漏了某些内容,是否有需要使用 final 与工会合作的情况?

2 个答案:

答案 0 :(得分:1)

就像你说的那样,union无法派生,所以final说明符对它们没有任何影响。 其他而不是std::is_final的结果,可以使用下面的代码测试哪些行为,其中所有断言都通过:

struct P final { };
union U1 { };
union U2 final { }; // 'union' with 'final' specifier

template <class T>
void test_is_final()
{
    static_assert( std::is_final<T>::value, "");
    static_assert( std::is_final<const T>::value, "");
    static_assert( std::is_final<volatile T>::value, "");
    static_assert( std::is_final<const volatile T>::value, "");
}

template <class T>
void test_is_not_final()
{
    static_assert(!std::is_final<T>::value, "");
    static_assert(!std::is_final<const T>::value, "");
    static_assert(!std::is_final<volatile T>::value, "");
    static_assert(!std::is_final<const volatile T>::value, "");
}

int main()
{
   test_is_final    <P>(); 
   test_is_not_final<P*>();    
   test_is_not_final<U1>();
   test_is_not_final<U1*>();
   test_is_final    <U2>(); // 'std::is_final' on a 'union' with 'final' specifier
   test_is_not_final<U2*>();   
}

答案 1 :(得分:0)

您可能正在使用依赖于std::is_final<T>的第三方库(即使是来自同一公司,但没有写访问权限)。一个常见的例子是半正确编写的单例模式:你绝对不希望BaseSingleton和DerivedSingleton并行实例化。阻止这种情况的一种(众所周知的坏方法)是std::enable_if<> std::is_final<T>。因此,您需要能够以某种方式指定它。问题是,为什么工会不是自动最终的。