<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">