最终说明符可以与类或结构一起使用,以禁止从它们继承。在这种情况下,我们只需要将我们的类/结构标记为final
:
class Foo final {
// ...
};
更有趣的是,相同的语法对于联盟有效:
union Foo final {
// ...
};
final也可以与联合定义一起使用,在这种情况下它具有 自工会以来没有影响(除了对std :: is_final的结果) 不能来自)
看起来最终说明符与联盟的使用是荒谬的。如果是这样,为什么甚至可以将工会标记为最终?只是为了一致性?或者有关 type_traits 的一些内容?我是否遗漏了某些内容,是否有需要使用 final 与工会合作的情况?
答案 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>
。因此,您需要能够以某种方式指定它。问题是,为什么工会不是自动最终的。