2016-10-28 6 views
0

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?

+0

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. –

+1

Reichen Sie einen Fehlerbericht ein. – Barry

+0

@Barry wo? Wie? – Vahagn

Antwort

0

Das ist im Standard "fixiert", indem Referenzen als Varianten-Alternativen (vorerst) verboten sind. Der Schnappschuss von GCC 7.0.1 vom 2017-03-29 scheint das richtig zu machen.

Verwandte Themen