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

나는 "(m.lock(), & m)"이 부분을 제외하고 모든 것을 이해 (나는 믿는다). 이 모든 것이 스마트 포인터를 초기화하는 첫 번째 매개 변수 인 것으로 보입니다. 그 복합 문은 무엇을 평가합니까? 그것은 단순히 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

좋아요, 나는 전에 쉼표 연산자에 대해 들어 보지 못했습니다. (또는 "for"루프에만 국한된 것 같아요.) 내 문장은 shared_ptr이 소유권을 얻은 후에 뮤텍스를 잠급니다. 생성자의 몸체를 잠그는 것에 대한 우려가 있습니까? – helmk

+1

@helmk'm'이 잠겨 있지 않아도 deleter가'm'의 잠금을 해제하기 때문에'pv'의 생성이 실패하면 UB를 실행하게됩니다. (이것은 포인터와 deleter를 취하는'boost :: shared_ptr'의 생성자에 의해 보장됩니다.) –

+0

ok, 감사합니다. – helmk