<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/127307>127307</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
libc++: `std::ranges::to` does not match standards.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
libc++
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
AnonymousPC
</td>
</tr>
</table>
<pre>
This code below can work on gcc, but compile failed on clang++ (version=19.1.7).
```cpp
#include <ranges>
struct my_vector
{
void emplace_back(auto&&...) { /*assume we do something here*/; }
};
int main ( )
{
auto my_vec = std::vector<int>() | std::ranges::to<my_vector>();
}
```
- According to `https://en.cppreference.com/w/cpp/ranges/to`,
- A container is `ranges::toable` (non-recursive) iff container implements
- constructor `container(range&&)`, or
- constructor `container(std::from_range_t, range&&)`, or
- constructor `container(iterator, sentinel)`, or
- satisfies concept `container-appendable`.
- We now focus on the 4th case.
- In standard, A container is `container-appendable` iff container has member function `emplace_back()` or `push_back()` or `emplace()` or `insert()`.
- Then, we should use a for-loop to put the items into this container one-by-one.
- What libc++ did:
- in file `.../c++/v1/__ranges/to.h`
- define `__container_insertable` concept, which **only accepts a container who implements either `push_back()` or `insert()`**. libc++ did not care `emplace_back()` and `emplace()`.
- put items into container through `ranges::copy(__range, ranges::__container_inserter<range_reference_t<_Range>>(__result));`, which then calls `back_insert_iterator`(if push_back) or `insert_iterator`(if insert).
- back_insert_iterator has `operator=(container::value_type&&)` to *do* this push_back(), but **what if the container(which might be trivial) who does not typedef value_type?** same do insert_iterator.
- What is expected:
- Accepts all 4 kinds of "container-appendable" container.
- get rid of the fancy insert_iterator, an use a **trivial for-loop** to append elements one by one. (it only takes <= 5 lines)
# Thank you
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVs2O6ygTfRqyKcVyoPO3yMKdvpG-3afRle7SwlCOmcZgAU4mbz8CnN_bPRpppEjpjqmqc05VHcO9V0eDuCPLd7L8mPExdNbtKmPNpbej__9-1lh52f3slAdhJUKD2p5BcANn6z7BGjgKQegemjGAsP2gNELLlUYZHwrNzZHQd0LfgdDNCZ1X1hD2sdgWi2JN6LYgZRU_qzJ_xDDEfylTRuhRIhC2d9wc0RP2I5_1wY0iQH-pTyiCdfHX9TspKzhZJQH7QXOBdcPFJ6EbPgZL6IrQVVEUhG6BrCOWA6EV937sEc4I0oK3PYZOmSN06JDQKp5h70DWH6nAB2Hvub4yAXquTGQEhG7v9QEglpugAWEf4IMkrCKsmrCyvTIhUqGbDGZ_P3LlGf8OlrD9neI1YAKRMV01y7DmUAlhnYwUggWyKrsQhpQusj2gKcQwOGzRoRFYCNsTejgTeoia08NUnR6CjTnpHjKlOVQgrAlcGXSgfMz8jJQ3GsmqjHoYa-YOxei8OmEkqNr2MbofNPZogp-SQyogrMlNtS5mv50ndJMq5f5F-hlY6vm_ib5J2zrb1ylXHWKG_5ZWBXQ8toXuwaMJyqB-TPNEzvOgfKswbpAROISnbHM-DGjkJGFx0_wXgrFnaK0Yfdyk0CG8hQ4E91hcD_3PgA_cSO5kLPx7n74p89KVjnvosW_QQTsaEZQ1MfhlkTJByGoMo---fDAFvf6sjEcXbr8mBnP42aGJwM8IvrOjljB6BA6tdXNt7RDneBhDIq8C9h6UCRZCtqMrfGtw3lzm1mBx3YRfHQ-gVSMm75EqzcEkmzLQRp-KQKInHKZjhB5OC0IPdf2wC0WXNwzmILFVJoXV9a18naldlZ16nFh1SnSQnKSyRl-Ai_jIA38Af-7s41agCh3-s8IvUub8xQtbMDaA4A6_byQ38quGFbfZnSftH3S_ow6ds-Oxe7UCYYcLoZtJv9ueTU9_Fw3d1d3rmy_VgbB9_UdKwH5k46trh37UISLMHpg3LSscOjQguNZp5CPJKX1929N4fKNaeBB1-yTn70evMm8fBfkqeVofsirtMGVgH4Ru7naR3Z_rEetwGZ5MJ_k0raQltMpT_dr16c2am3yOU63atA6PdpRl6NWxC9AgBKdOikdDStMlLfo0DrG6xBYesLBDzgye9-kt-MItcb9vlPKAfw0oAj6uU3Uda63hDT6VkR5sC4TSL-2H0jv4m5MdMYBTMsZFdi034vIKJorBzWQRGfdE9WYYE5tgIRcEvC6WNQjNJX4VkBwc0koG_ok-3jHiu3oJWpm49tvpUkIZ_Oy4-YSLHWdyx-SWbfkMd4s1267KzZrRWbdjjAtO18tScPq2WZSyXQjJFyu2LUu2lmymdrSky5IuluWGbZa0WDRcrrbI12vRvDWiJW8l9lzpQutTX1h3nCnvR9wt6JqV65nmDWqf7miU3tecUBrvbG4Xo-bNePTkrdTKB3_PE1TQuHuIYVUc1e9uHKvyPi09D6K7vV58MRud3j3fKI4qdGMzXSRizelrPjj7J4pA6CERiUY6cTnt6N8BAAD__2pBQq4">