2016-08-02 1 views
1

VS2008을 사용 중이며 boost 1.51에서 1.61로 변경되었습니다. 불행하게도 부스트 아래에 명시 즉 조각을 bool로하는 옵션의 캐스트를 boost::optional<T>을 변경하기로 결정하는 것은 더 이상boost :: optional가 암시 적 함수를 변경했습니다.

boost::optional<TYPE> optType; 
TYPE t = default; 
if (optType) 
    t = optType; 

당신은 명시 적으로이 작품을 만들기 위해 booloptType 캐스트 할 필요가 유효하지 않습니다.

여전히 불행한 것은 (여전히 잘못된 결과로 인해) 컴파일되고 사용 된 위치를 감지 할 수 없다는 것입니다. 누구든지 그 장소를 감지 할 수있는 (침입적인) 방법을 알고 있습니까?

부스트 1.51 hpp-file에서 암시 적 캐스트를 deprecated로 표시하려고했지만 컴파일러에서 아무런 경고도 표시하지 않습니다.

내가 살펴 봐야하는 코드의 양은 수십만 행이기 때문에 이것이 필요한 이유입니다. 특정 코드에서

+5

. 어쩌면 당신이 사용하는 부울로의 명시 적 변환은'operator bool' 이외의 일을합니다. –

+5

네,'명시 적 연산자 bool()'은'if' 조건에서 작동해야합니다. 그것이 작동하지 않는다면 컴파일되지 않을 것입니다. 그래서 _ "더 불행하게도 이것은 여전히 ​​잘못된 컴파일 결과로 컴파일됩니다"_는 의미가 없습니다. 문제를 보여주는 완전한 코드를 제공하십시오 (가급적이면 'default'키워드를 잘못 사용하지 마십시오!). –

+1

IIRC, VS2008은 변환 연산자에서 '명시 적'을 지원하지 않습니다. Boost는 아마도 일종의 "안전한 bool"로 다시 불이행 할 것입니다. 연산자가 마침내 어떻게 보이는지 보려면, 사전 처리 된 파일을 (MCVE를 기반으로하여) 일종의 덤프로 살펴보고 부스트 소스에 주석을 달아 볼 수 있습니다. – Niall

답변

1

, 당신은 단순히

그러나
boost::optional<TYPE> optType; 
TYPE t = default; 
if (optType) 
    t = true; 

, 당신은 TYPE 값을 얻기 위해 의미 않았다 쓸 수 있을까?

if (optType) 
    t = *optType; 

할 수도 있습니다 위의 코드에서`explicit` 아무 문제가 없습니다 단지에

t = optType.get_value_or(default);