[英]Bug in std::variant implementation of 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修復它之前,如何通過更改庫代碼來解決它?
在標准中,通過不允許引用作為變體替代(目前),已“修復”了該問題。 GCC 7.0.1的2017年3月29日的快照似乎正確地做到了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.