簡體   English   中英

gcc7的std :: variant實現中的錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM