2017-10-21 13 views
8

以下の用途::訪問は適切GCC 7.2の下でコンパイルをコンパイルに失敗したが、打ち鳴らす5.0でコンパイルに失敗しました。誰が問題が何であるか知っていますか?のstd ::訪問が打ち鳴らすの下でのstdの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++のバリアントはクランでサポートされていない非標準の機能を使用することも可能である可能性があります。 '-stdlib = libC++'でコンパイルします。 – chris

+0

お知らせ 'のstd :: <0>(V)'、 'のstd ::は(V)'などは基本的に同じエラー(との間で少数のインスタンス化の段階)で失敗ゲット。 – aschepler

+0

はたぶんだまされやすい人は、あなたはだまされやすい人らしさを検討する方法に応じて:https://stackoverflow.com/q/46506387/2069064を – Barry

答えて

8

は、これが唯一++のstd::variant(およびその他の構成にli​​bstdc影響しているようだbug 33222を知られています同じ組み合わせを使用して)。問題は友人の機能とテンプレートに関連しています。詳細はスレッドを参照してください。

のlibC++からのバリアントを使用すると、一時的にその間に++ libcに変更する場合がありますので、のlibstdC++を使用することを友人たちの技術を使用していないようです。

+0

ありがとうございます。それはclangバグのように見えます。バグがclang devブランチで修正されたかどうかは誰にも分かりますか? – user2736667

+0

@ user2736667今のところ、いいえ、申し訳ありません。これはかなり深刻なので、これは最終的には固定されるとはかなり確信しています。 – Rakete1111

関連する問題