this Рассмотрим код:Ошибка в станд :: вариант реализации 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 ?!
С g++ (GCC) 7.0.0 20161023 (experimental)
последняя строка завершается с сообщением об ошибке:
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)...); }
указывая конструктору:
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)...); }
Фактически перед этим возникло еще два вопроса:
Сначала он жаловался call to non-constexpr function ‘std::_Enable_default_constructor<false, _Tag>::_Enable_default_constructor(std::_Enable_default_constructor_tag)
я установил его, сделав constexpr
конструктор _Enable_default_constructor<false, _Tag>::_Enable_default_constructor(_Enable_default_constructor_tag) { }
Тогда жаловался _M_storage’ must be initialized by mem-initializer in ‘constexpr’ constuctor
я установил его, добавив : _M_storage{}
в список инициализации членов, хотя я не думаю, что он должен жалуйтесь, поскольку добавленная строка должна быть создана неявно.
Итак, первый вопрос: это, безусловно, ошибка?
И второй вопрос: как я могу обойти это, изменив коды библиотек до того, как gcc исправит это?
Я не уверен на 100%, но я считаю, [эта ошибка] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70029) связана с вашей проблемой. –
Отправить отчет об ошибке. – Barry
@ Барри где? как? – Vahagn