C++ 中标签和枚举调度有什么区别?

jwc*_*hoi 5 c++ tags enums

std::unique_lock几个接受xxx_lock_t. 这些是空结构:

struct adopt_lock_t {};
struct defer_lock_t {};
struct try_to_lock_t {};
Run Code Online (Sandbox Code Playgroud)

它们对应的值如下。

constexpr adopt_lock_t  adopt_lock {};
constexpr defer_lock_t  defer_lock {};
constexpr try_to_lock_t try_to_lock {};
Run Code Online (Sandbox Code Playgroud)

最后,这是std::unique_lock的构造函数。

unique_lock (mutex_type& m, adopt_lock_t tag);
unique_lock (mutex_type& m, defer_lock_t tag) noexcept;
unique_lock (mutex_type& m, try_to_lock_t tag);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

为什么他们使用这种标签而不是枚举类型?

我认为通过使用枚举,我们不需要为每种类型的锁定声明构造函数。我也同意,通过实现每种类型的构造函数,不需要比较实现中给出的锁类型。

主要原因是什么?

Jod*_*cus 5

如果您使用enum,则必须在运行时确定锁定时选择哪种模式,\xc3\xa0 la:

\n\n
if(mode == lock::adopt_lock) {\n   ...\n} else if(mode == lock::defer_lock) {\n   ...\n}\nelse ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过重载,您可以将这种区别转移到编译时。

\n