空结构或匿名结构作为标记

时间:2015-06-19 06:27:19

标签: c++ c++11 tags c++14

将标记类型定义为匿名空结构还是空结构之间的用法是否存在差异?

using A = struct {};
struct B {};

在我看来,唯一的区别是&#34;有效的&#34;类型名称,当使用一种反射时(即__PRETTY_FUNCTION__<cxxabi.h>:abi::__cxa_demangle(typeid().name())等)。

两种方式的ADL工作:

namespace ns
{

using A = struct {};
struct B {};

constexpr
bool
adl(A)
{
    return true;
}

constexpr
bool
adl(B)
{
    return true;
}

}

template< typename type >
constexpr
bool
adl(type)
{
    return false;
}

static_assert(adl(ns::A{}));
static_assert(adl(ns::B{}));

1 个答案:

答案 0 :(得分:5)

除了您已经注意到的不同字符串之外,唯一重要的区别是您可以使用详细说明类型说明符来引用B,因此您可以说struct B b;代替B b;,但您无法使用struct A a;,因为A是typedef-name而不是类名。

然而,几乎没有理由说struct B而不仅仅是B,所以在实践中差异并不重要,尤其是对于标签类型。