On Tue, 18 Mar 2025 at 12:04, Tomasz Kaminski wrote:
> On Tue, Mar 18, 2025 at 12:55 PM Jonathan Wakely <jwak...@redhat.com> wrote:
>>
>> On 17/03/25 09:21 +0100, Tomasz Kamiński wrote:
>> >+       */
>> >+      template<__detail::__container_compatible_range<_Key> _Rg>
>> >+      void
>> >+      insert_range(_Rg&& __rg)
>> >+      {
>> >+        auto __first = ranges::begin(__rg);
>> >+        const auto __last = ranges::end(__rg);
>> >+        using _Rv = __remove_cvref_t<ranges::range_value_t<_Rg>>;
>>
>> This can just use remove_cvref_t because it's C++23 code. We need to
>> use __remove_cvref_t for C++11/14/17 because std::remove_cvref_t
>> wasn't added until C++20.
>
> I thought that we would prefer to use internal __remove_cvref_t when possible,
> as we could later define it as __remove_reference(__remove_cv_t(T)), so
> we will not trigger instantations of the type_traits.

That's not possible because we use __remove_cvref_t in return types
and default template arguments, which means it needs to be mangled.
Unlike with Clang, GCC's __remove_reference, __remove_cv etc built-ins
cannot be mangled (intentionally).

We could define *another* alias, e.g. __remove_cvref_, which could use
the built-ins directly, and would not be allowed in signatures and
mangled contexts. But that doesn't exist today, and __remove_cvref_t
won't become that, so I think we might as well just use remove_cvref_t
here. If we add a non-mangled alias later, we would already need to
find all the places that could benefit from it and change them.

Reply via email to