在将标记类型定义为匿名空结构或空结构之间有什么区别?
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{}));
最佳答案
除了您已经注意到的不同字符串之外,唯一的显着区别是您可以使用精致的类型说明符来引用B
,因此您可以说struct B b;
而不是B b;
,但是您不能使用struct A a;
,因为A
是一个typedef名称不是类名。
但是,几乎没有理由说struct B
而不是B
,因此实际上区别并不重要,尤其是对于标签类型而言。
关于c++ - 空结构或匿名结构作为标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30931331/