[Bug libstdc++/87194] New: Associative container cannot be inserted from move iterators that refer to elements implicitly convertible to value_type
kariya_mitsuru at hotmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Sep 3 05:50:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87194
Bug ID: 87194
Summary: Associative container cannot be inserted from move
iterators that refer to elements implicitly
convertible to value_type
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: kariya_mitsuru at hotmail dot com
Target Milestone: ---
The sample code below is failed to compile by GCC HEAD (Sep 1, 2018).
=========================== sample code ===========================
#include <array>
#include <iterator>
#include <set>
#include <string>
#include <utility>
struct S {
S(const char* s) : s(s) {}
operator std::string() && { return std::move(s); }
std::string s;
};
int main()
{
std::array<S, 3> a{ "abc", "def", "ghi" };
std::set<std::string> s;
s.insert(std::make_move_iterator(a.begin()),
std::make_move_iterator(a.end()));
}
=========================== sample code ===========================
cf. https://wandbox.org/permlink/c8rASYAgPKxRBUt0
The C++17 standard [associative.reqmts] says,
p.8: ..., i and j satisfy input iterator requirements and refer to elements
implicitly convertible to value_type, ...
a.insert(i,j) in Table 90: Requires: value_type shall be EmplaceConstructible
into X from *i.
So, I think that the sample code should be coumpiled successfully.
The unordered_set has the same problem.
cf. https://wandbox.org/permlink/Q4pVJkFVSS2Qijrg
But I don't know why, [unord.req] says that
p.8: ..., i and j denote input iterators that refer to value_type, ...
So, I am not sure that the unordered_set should be too.
More information about the Gcc-bugs
mailing list