c++ - 空结构或匿名结构作为标签

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

将标记类型定义为匿名空结构或定义为空结构在使用上有什么区别吗?

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{}));

最佳答案

除了您已经注意到的不同字符串之外,唯一显着的区别是您可以使用 elaborated-type-specifier 引用 B,因此您可以说 struct B b; 而不是 B b; 但你不能使用 struct A a; 因为 A 是一个typedef-name 不是类名。

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

关于c++ - 空结构或匿名结构作为标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931331/

相关文章:

c++ - 为什么要为 std::forward_list 拼接整个列表或线性范围?

mysql - 我应该如何在数据库中存储域名标签?

video - 如果支持,请使用 HTML <video> 标签,否则使用 lightbox??? (脚本)

c++ - 将 if-else 转换为 for 循环

c++ - 如何在不使用魔数(Magic Number)的情况下将 "char number"转换为 int? (在 C++ 中)

c++ - 比较两种类型是否为 "literally"相同

c++ - 可以使用临时的 stringstream 对象吗?

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

android - 定期读取 NFC 标签

c++ - 同时访问列表中的元素及其后继元素