2012-05-10 2 views
1

-std = C++ 0x 옵션을 사용하여 gcc 4.4.6에서 unique_ptr을 활성화했습니다. 그것은 꽤 잘 작동하는 것으로 보입니다. 그리고 필자는 필자가 필요로하는 것, 즉 커스텀 Deleter를 가진 스코프 된 포인터입니다.std :: unique_ptr ostream inserter

그러나 문제를 발견했습니다.

typedef std::unique_ptr<X> XPtr; 

XPtr ptr1(new X); 
XPtr ptr2(new X); 

std::cout << "ptr1 points to " << ptr1 << std::endl; 
std::cout << "ptr2 points to " << ptr2 << std::endl; 

표시 : 1

에 1 PTR2 포인트 PTR1 점 I는 ostream에 삽입이 부울 값을 삽입 생각.

다음 내용이 수정되었지만 표준 라이브러리의 일부가 아니어야하는지 궁금합니다.

template<typename Target, typename Deleter> 
std::ostream & operator <<(std::ostream & out, const std::unique_ptr<Target, Deleter> & value) 
{ 
    // output the raw pointer 
    out << value.get(); 
    return out; 
} 

그래서 질문은 :이 GCC의 현재 unique_ptr 구현의 제한, 또는 내가 unique_ptr에서 너무 많은 기대는 무엇입니까?

+0

이렇게해서는 안됩니다. 'unique_ptr'을'bool'로 변환하는 것은'explicit'으로 표시되어야합니다. – pmr

답변

4

이것은 gcc 4.4.6과 함께 제공되는 라이브러리의 버그 인 것 같습니다. 변환은

explicit operator bool() const noexcept; 

이며 ostream에 포인터를 삽입 시도하여 트리거 할 수 없습니다. 결과적으로 컴파일 오류가 발생하고 gcc 4.7에서 정확히 이 발생합니다.

편집 : gcc 4.4는 명시 적 변환 연산자를 지원하지 않았으므로 그 당시에는 작동하지 않았습니다. C++ 11을 실제로 사용하려면 새로운 gcc 버전을 얻어야합니다.

1

unique_ptr에는 operator bool() const이 정의되어 있으므로 unique_ptr 개체가 bool 값으로 변환됩니다. 발견 한대로 포인터 주소를 인쇄하려면 get() 메서드를 사용해야합니다.

+0

하지만 그렇게되지는 않습니다. 연산자는 명시 적이어야하며 여기에는 변환이 없어야합니다. 이것은 버그입니다. – pmr

관련 문제