[英]insert_or_assign is allowing iterator
我有這段代碼:
auto it = my_map.lower_bound(my_key);
以下斷言給我錯誤:
static_assert(std::is_same<decltype(it), std::map<K, V>::const_iterator>::value, "Error");
並且以下一項是可以的:
static_assert(std::is_same<decltype(it), std::map<K, V>::iterator>::value, "Error");
然后,編譯器沒有給我const_iterator
。 好。 但在這兒:
my_map.insert_or_assign(it, my_key, some_val);
即使使用iterator
(不是const_iterator
),該函數也可以正常工作。 但是,在此鏈接上 ,在insert_or_assign
簽名上,我只有const_iterator
參數。 我還在Visual Studio上搜索了.h
文件,並且此信息匹配。 經過GCC 7.2+和Visual Studio 2015的測試,所有內容均可編譯並運行。
為什么要編譯? 為什么insert_or_assign
接受iterator
?
所有容器都必須提供可轉換為const_iterator
的iterator
類型。 請參閱容器要求表
X::iterator
必須是滿足前向迭代器要求的任何迭代器類別。 可轉換為X::const_iterator
。
因此,將根據在insert_or_assign
的調用中lower_bound
返回的iterator
構造一個const_iterator
。
您的lower_bound
調用將為您提供非常量映射上的非常量迭代器。 但是,存在從非常量迭代器到常量迭代器的自動轉換,因此任何需要const_iterator的函數都可以使用相同類型的非常量迭代器進行調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.