2016-08-02 46 views
1

我正在使用VS2008並剛剛從boost 1.51更改爲1.61。不幸的是升壓決定改變boost::optional<T>,並從可選投下面bool的明確,即該段不再有效boost :: optional已更改隱式函數

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

您必須顯式轉換optTypebool,使這項工作。

更不幸的是,這仍然編譯(與錯誤的結果c),我無法檢測到它在哪裏使用。有沒有人知道任何(甚至侵入式)方法來檢測這些地方。

我試圖標記隱式強制轉換爲boost 1.51 hpp文件中的棄用,但由於某些原因,編譯器不顯示任何警告。

我必須查看的代碼量是幾十萬行,這就是爲什麼我需要這樣做。

+5

沒有在上面的代碼'explicit'沒有問題。也許顯式轉換爲你使用的布爾除了'operator bool'之外的其他東西。 –

+5

是的,''顯式運算符bool()'需要在'if'條件下工作。如果它不起作用,那麼它就不會編譯,所以_「更不幸的是,它仍然編譯(錯誤的結果是c)」_沒有意義。請提供完整的代碼來顯示問題(最好不要濫用關鍵字'default'!) –

+1

IIRC,VS2008不支持轉換運算符上的'explicit'。 Boost可能違約回到某種「安全布爾」。要查看運算符最終的樣子,可以查看轉儲預處理文件(基於某種MCVE) - 然後在boost源文件中對其進行註釋。 – Niall

回答

1

在您的特定片段,你可以簡單地寫

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

但是,你的意思是讓TYPE價值?

if (optType) 
    t = *optType; 

你也可以簡單地

t = optType.get_value_or(default);