final 说明符 可以与类或结构一起使用以禁止从它们继承。在这种情况下,我们只需要将我们的类/结构标记为 final
:
class Foo final {
// ...
};
更有趣的是,相同的语法对 union 有效:
union Foo final {
// ...
};
final can also be used with a union definition, in which case it has no effect (other than on the outcome of std::is_final), since unions cannot be derived from)
看起来 final 说明符 与 union 的用法是荒谬的。如果是这样,为什么甚至可以将 union 标记为最终的?只是为了一致性?或者关于 type_traits 的一些东西?我是否遗漏了什么,是否存在我们需要将 final 与 union 一起使用的情况?
最佳答案
正如您所说,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*>();
}
关于c++ - 是否有任何理由将 final 说明符与 union 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40063717/