2017-09-30 7 views
13

。しかし、のlibstdC++を使用して(バージョン5.0)++打ち鳴らすの下でコンパイルしたとき、私はget方法で、次のエラーが表示されます。次のコードをバリアントの<string>が打ち鳴らすの下で失敗し得る++ではなく、G ++

/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../include/c++/7.2.0/variant:238:46: fatal error: cannot cast 'std::variant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >' to its private base class 'std::__detail::__variant::_Variant_storage<false, std:: 
__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >' 
     return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u); 

が、これはコンパイラのバグです、または私のコードは、どのような方法で違法ですか?

+0

'libC++'を標準ライブラリの実装として使用するように指定しましたか? IIRCでは、clangはデフォルトでlibstdC++を使用します。 – StoryTeller

+0

私はここで何が違法であるかはわかりませんが、もしそうなら、これはかなり基本的なことです。 –

+2

gcc + libstdC++で動作すると、clang + libC++で動作しますが、clang + libstdC++の場合は、clangとlibstdC++の微妙な互換性がない可能性が最も高いケースです。答えは、非互換性が何であるかを正確に指摘しなければならない。 – hvd

答えて

13

これは、その再現ジョナサンWakelyの礼儀は非常に関連しているはずですclang bug 31852(とも33222)、によって引き起こされる:

template<typename V> auto get(V&) { } 

template<typename> 
class variant 
{ 
    template<typename V> friend auto get(V&); 
}; 

int main() 
{ 
    variant<int> v{}; 
    get(v); // error: ambiguous 
} 

打ち鳴らすには、適切にプレースホルダ型を持っている友人の宣言を認識しません。正確にどのようにstd::getを実装のlibstdC++れている:

// Returns the typed storage for __v. 
template<size_t _Np, typename _Variant> 
constexpr decltype(auto) __get(_Variant&& __v) 
{ 
    return __get(std::in_place_index<_Np>, std::forward<_Variant>(__v)._M_u); 
} 

これはvariantのプライベートメンバにアクセスしますが、この機能はproperly declared a friendです:実装が有効である++の

template<size_t _Np, typename _Vp> 
friend constexpr decltype(auto) __detail::__variant::__get(_Vp&& __v); 

にlibstdc、打ち鳴らすだけ__getがAであるとは思いません。 friend

+2

既知の回避策はありますか? – papirrin

+1

私は最良かつ合理的に安全な回避策は、開発中にlibstdC++のバリアントヘッダーファイルの修正版を使用することだと思います。あなたが変更する必要があるのは、friend宣言をコメントアウトし、__detail :: _ variant :: _ Variant_base(これは基本的なバリアントストレージへの__getアクセスを提供します)から一般に派生しています。私はプライマリコンパイラとしてGCCを使用していて、悪い副作用に気づいていない間に、clang-tidyからたくさんのエラーを無音にするためにこれを使います。 – Stacker

関連する問題