2012-06-27 3 views
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)) {} 
}; 

I (кажется, я) понимать все, кроме этой части "(m.lock(), & м)". Все это кажется первым параметром для инициализации умного указателя. Что оценивает этот составной оператор? Это просто адрес m? Почему блокировка помещена там как часть списка параметров (и как это законно)? Вместо этого я бы ожидал выписки вроде:

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

Является ли мой альтернативный оператор изменением функциональности?

+5

http://en.wikipedia.org/wiki/Comma_operator – jrok

+0

спасибо, это в значительной степени объясняет это. – helmk

ответ

2

Что оценивает этот составной оператор? Это просто адрес m?

Да

Почему замок помещен там как часть списка параметров (и как это законно)?

Конструктор должен приобрести замок, и это подходящее место для его размещения. иначе общий указатель должен быть установлен в теле конструктора.

Это законно, потому что выражения, включая оператор запятой, используются в инициализаторах. Дополнительные круглые скобки необходимы для устранения неоднозначности оператора запятой из разделяющих запятую параметров, но в остальном любое из них допускается.

+0

Хорошо, я раньше не слышал о запятой (или, думаю, я думал, что это относится к циклу «за»). Мое утверждение блокирует мьютекс после того, как shared_ptr приобрел право собственности, а их блокирует его раньше. Есть ли проблема в блокировке в корпусе конструктора? – helmk

+1

@helmk Вы запускаете UB, если конструкция 'pv' терпит неудачу, потому что делектор будет использовать разблокировку' m', хотя 'm' не был заблокирован. (Это гарантируется конструктором 'boost :: shared_ptr', который принимает указатель и deleter.) –

+0

ОК, это имеет смысл, спасибо. – helmk

Смежные вопросы