首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11空标志类

C++11空标志类
EN

Stack Overflow用户
提问于 2012-11-11 07:36:50
回答 3查看 162关注 0票数 5

在C++11中的一些unique_lock constructors中,可以像传递标志一样传递一些classes,例如

代码语言:javascript
复制
auto lock = std::unique_lock<std::mutex> lock(m, std::defer_lock);

其中std::defer_lock定义为

代码语言:javascript
复制
struct defer_lock {}

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

我尝试将其应用于一个小的代码示例,但我无法对其进行编译:

代码语言:javascript
复制
class A {};
void foo(A a) {}

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

当我像foo(A());一样放入括号时,它可以工作,但我看不出与STL的区别。为什么这会有不同的表现呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-11 07:42:31

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

票数 9
EN

Stack Overflow用户

发布于 2012-11-11 07:41:48

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

代码语言:javascript
复制
constexpr std::defer_lock_t defer_lock = std::defer_lock_t();

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

代码语言:javascript
复制
struct A {} A;

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

票数 5
EN

Stack Overflow用户

发布于 2012-11-11 07:43:27

标准库中的实际代码是

代码语言:javascript
复制
struct defer_lock_t {};
constexpr defer_lock_t defer_lock {};

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13327158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档