簡體   English   中英

為什么在GCC中std :: set的演繹失敗?

[英]Why does deduction fail for std::set in GCC?

我有一個std::set ,它允許從迭代器范圍中扣除。

#include <iostream>
#include <set>

int main() 
{
   std::set s1 = {1,2,3,4}; 
   std::set s2(s1.begin(), s1.end());
}

上述程序未能在GCC中編譯。

為什么std::set演繹失敗?

只需采用當前的GCC版本(此時為8.0.0)即可構建。 std::set的模板推導指南似乎沒有在較舊的GCC版本的stdlib中實現。

std::set的迭代器構造函數的推導指南最近才被添加到gcc HEAD中。

根據GitHub上的gcc-mirror/gccstd::set的迭代器構造函數的演繹指南已添加並在不到兩周前合並到libstdc ++ - v3

(從diff中提取libstdc++-v3/include/bits/stl_set.h

  +#if __cpp_deduction_guides >= 201606 + + template<typename _InputIterator, + typename _Compare = + less<typename iterator_traits<_InputIterator>::value_type>, + typename _Allocator = + allocator<typename iterator_traits<_InputIterator>::value_type>, + typename = _RequireInputIter<_InputIterator>, + typename = _RequireAllocator<_Allocator>> + set(_InputIterator, _InputIterator, + _Compare = _Compare(), _Allocator = _Allocator()) + -> set<typename iterator_traits<_InputIterator>::value_type, + _Compare, _Allocator>; + + template<typename _Key, typename _Compare = less<_Key>, + typename _Allocator = allocator<_Key>, + typename = _RequireAllocator<_Allocator>> + set(initializer_list<_Key>, + _Compare = _Compare(), _Allocator = _Allocator()) + -> set<_Key, _Compare, _Allocator>; + + template<typename _InputIterator, typename _Allocator, + typename = _RequireInputIter<_InputIterator>, + typename = _RequireAllocator<_Allocator>> + set(_InputIterator, _InputIterator, _Allocator) + -> set<typename iterator_traits<_InputIterator>::value_type, + less<typename iterator_traits<_InputIterator>::value_type>, + _Allocator>; + + template<typename _Key, typename _Allocator, + typename = _RequireAllocator<_Allocator>> + set(initializer_list<_Key>, _Allocator) + -> set<_Key, less<_Key>, _Allocator>; + +#endif 

這自然解釋了為什么模板參數推導對於早期版本的gcc(例如7.2.0)的迭代器構造函數的模板set失敗了。 如果使用當前的gcc trunk( gcc HEAD 8.0.0 20171103(實驗性),則可以使用上面的推論指南 ,並且對於迭代器構造函數,模板參數推導也是成功的。

至於為什么模板參數推導在gcc 7.2.0中已經成功用於std::initializer_list構造函數(沒有推導指南;也在上面的提交中添加了指南),正如在@JohnZwinck刪除的答案中有所解釋的那樣 ,這些構造函數不是自己模板化的(不是由他們自己的模板參數列表參數化),而是使用set的成員類型value_type -which只是set的第一個模板類型參數的typedef Key -as std::initializer list的模板參數,即使沒有明確的演繹指南,我認為這會導致一個簡單的演繹路徑成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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