在将标记类型定义为匿名空结构或空结构之间有什么区别?

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/

10-11 22:45
查看更多