2017-10-21 1 views
8

Die folgenden Verwendungen von std :: besuchen Kompilierungen ordnungsgemäß unter gcc 7.2 aber nicht unter clang 5.0 kompilieren. Weiß jemand, was das Problem ist?std :: visit für variante nicht kompilieren unter 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); 
} 

Der erste Fehler ist dies:

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); 

Hier ist ein Link zu Godbolt zeigt dieser Fehler: https://godbolt.org/g/5iaKUm

+0

Es könnte möglich sein, dass die Variante von libstdC++ eine Nicht-Standard-Funktion verwendet, die Clang nicht unterstützt. Es kompiliert mit '-stdlib = libC++'. – chris

+0

Hinweis 'std :: get <0> (v)', 'std :: get (v)', etc. scheitern mit im Wesentlichen den gleichen Fehler (und weniger Instanziierung Schritte dazwischen). – aschepler

+0

Vielleicht ein Betrogener, abhängig davon, wie Sie betrogen denken: https://Stackoverflow.com/q/46506387/2069064 – Barry

Antwort

8

Diese bug 33222 bekannt ist, dass nur scheint libstdC++ 's std::variant (und andere Konstrukte zu beeinflussen mit der gleichen Kombination). Das Problem hängt mit der Funktion friend to template zusammen - siehe den Thread für weitere Details.

Die Variante von libC++ scheint nicht die Technik der Freunde, die libstdC++ verwendet, zu verwenden, so dass Sie in der Zwischenzeit vorübergehend zu libC++ wechseln möchten.

+0

Danke. Es sieht aus wie ein Clang Bug. Weiß jemand, ob der Fehler im Clang-Dev-Zweig behoben wurde? – user2736667

+0

@ user2736667 Ab sofort, nein, tut mir leid. Ich bin mir ziemlich sicher, dass dies irgendwann behoben wird, da dies ziemlich ernst ist. – Rakete1111

Verwandte Themen