将标记类型定义为匿名空结构还是空结构之间的用法是否存在差异?
using A = struct {};
struct B {};
在我看来,唯一的区别是"有效的"类型名称,当使用一种反射时(即__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{}));
答案 0 :(得分:5)
除了您已经注意到的不同字符串之外,唯一重要的区别是您可以使用详细说明类型说明符来引用B
,因此您可以说struct B b;
代替B b;
,但您无法使用struct A a;
,因为A
是typedef-name而不是类名。
然而,几乎没有理由说struct B
而不仅仅是B
,所以在实践中差异并不重要,尤其是对于标签类型。