3

我遇到了这个示例类http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/sp_techniques.html#as_lock并且我在语法上苦苦挣扎。

class shared_lock
{

private:

    shared_ptr<void> pv;

public:

    template<class Mutex> explicit shared_lock(Mutex & m): pv((m.lock(), &m), mem_fn(&Mutex::unlock)) {}
};

我(相信我)理解除了这部分“(m.lock(),&m)”之外的所有内容。整个事情似乎是初始化智能指针的第一个参数。该复合语句的评估结果是什么?仅仅是m的地址吗?为什么将锁作为参数列表的一部分放置在那里(以及它是如何合法的)?相反,我会期待这样的声明:

template<class Mutex> explicit shared_lock(Mutex & m): pv(&m, mem_fn(&Mutex::unlock)) {m.lock();}

我的替代语句会改变功能吗?

4

1 回答 1

2

该复合语句的评估结果是什么?仅仅是m的地址吗?

是的

为什么将锁作为参数列表的一部分放置在那里(以及它是如何合法的)?

构造函数需要获取锁,这是一个方便的放置它的地方。否则必须在构造函数的主体中设置共享指针。

这是合法的,因为表达式,包括逗号运算符,在初始化程序中使用。需要额外的括号来区分逗号运算符与逗号分隔参数,但除此之外,大多数表达式都是允许的。

于 2012-06-27T19:28:23.453 回答