Poniższy kod:dostać <string> dla odmiany nie pod brzękiem ++ ale nie g ++
variant<string> x = "abc";
cout << get<string>(x) << "\n";
działa dobrze pod g ++ (wersja 7.2). Jednak, gdy skompilowany pod brzękiem ++ (wersja 5.0), używając libstdC++, pojawia się następujący błąd w metodzie get
:
/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);
Jest to błąd kompilatora, czy mój kod nielegalne w jakikolwiek sposób?
Czy określiłeś, że 'libC++' powinno być używane jako standardowa implementacja biblioteki? IIRC, clang używa domyślnie libstdC++. – StoryTeller
Nie widzę, co tutaj jest nielegalne, ale jeśli tak, to byłoby całkiem podstawową rzeczą zepsuć ... –
Biorąc pod uwagę, że działa w gcc + libstdC++, działa w clang + libC++, ale kończy się niepowodzeniem w clang + libstdC++, najprawdopodobniej jest to subtelna niezgodność między clang a libstdC++. Odpowiedź powinna wskazywać dokładnie, czym jest niezgodność. – hvd