C++ 11空标志类

luc*_*nte 5 c++ constructor c++11

在C++ 11中的一些unique_lock 构造函数中,可以传递一些类,如标志,即

auto lock = std::unique_lock<std::mutex> lock(m, std::defer_lock);
Run Code Online (Sandbox Code Playgroud)

在哪里std::defer_lock定义为

struct defer_lock {}
Run Code Online (Sandbox Code Playgroud)

为什么这样做,而不是枚举?

我试图将它应用于一个小代码示例,但我无法编译:

class A {};
void foo(A a) {}

int main() {
  foo(A); // error: 'A' does not refer to a value
}
Run Code Online (Sandbox Code Playgroud)

当我把括号放在一起foo(A());工作时,但我没有看到STL的区别.为什么这有不同的表现?

Die*_*ühl 9

使用不同的类型来标记某个操作而不是某个操作enum会使得选择代码路径成为编译时选择而不是运行时选择.不同功能的实现也可以是截然不同的.

  • 这被称为"标签调度". (6认同)

jpa*_*cek 5

实际上,std::defer_lock没有定义为你写的,而是as

constexpr std::defer_lock_t defer_lock = std::defer_lock_t();
Run Code Online (Sandbox Code Playgroud)

这就是为什么你的版本"模仿"(严重)标准库定义不起作用的原因; 将你的定义改为例如.

struct A {} A;
Run Code Online (Sandbox Code Playgroud)

它会起作用.(或者,尝试稍微有点吸引力struct A_t {} A)