Betrachten this Code:Bug in std :: Variante Implementierung von gcc7
#include <variant>
constexpr auto cc = 'c';
constexpr std::variant<const int*,const char*> pp{&cc}; // passes
constexpr std::variant<const int&,const char&> rr{cc}; // FAILS ?!
Mit g++ (GCC) 7.0.0 20161023 (experimental)
die letzte Zeile nicht mit Fehlermeldung:
variant|199 col 9| error: call to non-constexpr function ‘void* operator new(std::size_t, void*)’
|| { ::new (&_M_storage) _Type(std::forward<_Args>(__args)...); }
zu Konstruktor zeigt:
template<typename... _Args>
constexpr _Uninitialized(in_place_index_t<0>, _Args&&... __args)
: _M_storage{} // This was added manually
{ ::new (&_M_storage) _Type(std::forward<_Args>(__args)...); }
Tatsächlich gab es vorher zwei weitere Probleme:
Zuerst es beschwerte call to non-constexpr function ‘std::_Enable_default_constructor<false, _Tag>::_Enable_default_constructor(std::_Enable_default_constructor_tag)
Ich habe es feste constexpr
, indem der Konstruktor _Enable_default_constructor<false, _Tag>::_Enable_default_constructor(_Enable_default_constructor_tag) { }
Dann ist es _M_storage’ must be initialized by mem-initializer in ‘constexpr’ constuctor
beschwerte ich es behoben haben durch : _M_storage{}
auf die Initialisierungsliste hinzufügen, obwohl ich nicht glaube, es sollte beschweren, da die hinzugefügte Zeile implizit generiert werden soll.
Also die erste Frage ist: das ist sicherlich ein Bug oder?
Und die zweite Frage ist: Wie kann ich umgehen, indem Sie die Bibliothekscodes ändern, bevor gcc es beheben wird?
Ich bin nicht 100% sicher, aber ich glaube, [dieser Fehler] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70029) hängt mit Ihrem Problem zusammen. –
Reichen Sie einen Fehlerbericht ein. – Barry
@Barry wo? Wie? – Vahagn