在C++11中的一些unique_lock constructors中,可以像传递标志一样传递一些classes,例如
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的区别。为什么这会有不同的表现呢?
发布于 2012-11-11 07:42:31
使用不同的类型来标记某个操作而不是enum,使得代码路径的选择采用编译时的选择,而不是运行时的选择。不同函数的实现也可能截然不同。
发布于 2012-11-11 07:41:48
实际上,std::defer_lock不是在您编写时定义的,而是定义为
constexpr std::defer_lock_t defer_lock = std::defer_lock_t();这就是为什么你的版本“模仿”(糟糕地)标准库定义不起作用的原因;将你的定义改为例如。
struct A {} A;它会起作用的。(或者,尝试更具吸引力的struct A_t {} A)
发布于 2012-11-11 07:43:27
标准库中的实际代码是
struct defer_lock_t {};
constexpr defer_lock_t defer_lock {};第一行定义了一个没有成员的类。第二行定义了该类型的对象。对象在函数调用中使用。
https://stackoverflow.com/questions/13327158
复制相似问题