5

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

auto lock = std::unique_lock<std::mutex> lock(m, std::defer_lock);

其中std::defer_lock定义为

struct defer_lock {}

为什么以这种方式完成,而不是使用枚举?

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

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

int main() {
  foo(A); // error: 'A' does not refer to a value
}

当我把括号放在foo(A());它的工作原理上时,但我看不出与 STL 的区别。为什么这在那里表现不同?

4

3 回答 3

9

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

于 2012-11-10T23:42:30.787 回答
5

实际上,std::defer_lock不是在您编写时定义,而是定义为

constexpr std::defer_lock_t defer_lock = std::defer_lock_t();

这就是为什么您的版本“模仿”(严重)标准库定义不起作用的原因;将您的定义更改为例如。

struct A {} A;

它会起作用。(或者,尝试更有吸引力struct A_t {} A

于 2012-11-10T23:41:48.073 回答
4

标准库中的实际代码是

struct defer_lock_t {};
constexpr defer_lock_t defer_lock {};

第一行定义了一个没有成员的类。第二行定义了该类型的对象。该对象在函数调用中使用。

于 2012-11-10T23:43:27.180 回答