2017-10-21 56 views
8

std :: visit的下列用法在gcc 7.2下正確編譯,但無法在鏗鏘5.0下編譯。有誰知道問題是什麼?std :: visit for variant無法在clang下編譯5

#include <variant> 

struct S1 {int foo() { return 0; }}; 
struct S2 {int foo() { return 1; }}; 

using V = std::variant<S1, S2>; 

int bar() { 
    V v; 
    return std::visit([](auto& s) { return s.foo(); }, v); 
} 

的第一個錯誤是:

include/c++/7.2.0/variant:238:46: error: cannot cast 'std::variant<S1, S2>' to its private base class 
    'std::__detail::__variant::_Variant_storage<true, S1, S2>' 
    return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u); 

這裏是godbolt一個鏈接顯示此錯誤:https://godbolt.org/g/5iaKUm

+0

libstdC++的變種可能會使用Clang不支持的非標準功能。它用'-stdlib = libC++'編譯。 – chris

+0

注意'std :: get <0>(v)','std :: get (v)'等等會失敗,並帶有基本相同的錯誤(以及更少的實例化步驟)。 – aschepler

+0

也許是一個騙局,取決於你如何考慮欺騙:https://stackoverflow.com/q/46506387/2069064 – Barry

回答

8

這被稱爲bug 33222似乎只的libstdC++的std::variant(和其他結構的影響使用相同的組合)。問題與模板的朋友函數有關 - 請參閱線程以獲取更多詳細信息。

來自libC++的變體似乎沒有使用libstdC++使用的朋友的技術,因此您可能需要在此期間臨時更改爲libC++。

+0

謝謝。它看起來像一個鏗鏘蟲。是否有人知道該bug是否已在叮咚開發分支中解決? – user2736667

+0

@ user2736667截至目前,不,對不起。我很確定這個問題最終會得到解決,因爲這非常嚴重。 – Rakete1111