2016-10-28 15 views
0

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 исправит это?

+0

Я не уверен на 100%, но я считаю, [эта ошибка] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70029) связана с вашей проблемой. –

+1

Отправить отчет об ошибке. – Barry

+0

@ Барри где? как? – Vahagn

ответ

0

Это «исправлено» в стандарте, запретив ссылки в качестве альтернативных вариантов (пока). Снимки GCC 7.0.1 с 2017-03-29, похоже, делают это правильно.