[libcxx-commits] [libcxx] [libc++] default the allocator arguemnt for most constructor (PR #169901)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Nov 28 03:12:08 PST 2025
https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/169901
Allocators are generally very cheap to copy, so avoiding copies by having separate overloads is not that useful. Defaulting them significanlty reduces the overload set the compiler has to consider and simplifies the code, since we can remove some functions in the future.
>From 03f92a9371c320f3594d7344b8b35042123afe05 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 28 Nov 2025 12:09:28 +0100
Subject: [PATCH] [libc++] default the allocator arguemnt for most constructor
---
libcxx/include/string | 47 +++++++++----------------------------------
1 file changed, 9 insertions(+), 38 deletions(-)
diff --git a/libcxx/include/string b/libcxx/include/string
index 2b3ba6d2d9b62..ea90be950ba11 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -1058,15 +1058,9 @@ public:
}
# endif // _LIBCPP_CXX03_LANG
- template <__enable_if_t<__is_allocator_v<_Allocator>, int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* _LIBCPP_DIAGNOSE_NULLPTR __s) {
- _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "basic_string(const char*) detected nullptr");
- __init(__s, traits_type::length(__s));
- }
-
template <__enable_if_t<__is_allocator_v<_Allocator>, int> = 0>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
- basic_string(const _CharT* _LIBCPP_DIAGNOSE_NULLPTR __s, const _Allocator& __a)
+ basic_string(const _CharT* _LIBCPP_DIAGNOSE_NULLPTR __s, const _Allocator& __a = _Allocator())
: __alloc_(__a) {
_LIBCPP_ASSERT_NON_NULL(__s != nullptr, "basic_string(const char*, allocator) detected nullptr");
__init(__s, traits_type::length(__s));
@@ -1076,22 +1070,14 @@ public:
basic_string(nullptr_t) = delete;
# endif
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(const _CharT* __s, size_type __n)
- _LIBCPP_DIAGNOSE_NULLPTR_IF(__n != 0 && __s == nullptr, " if n is not zero") {
- _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "basic_string(const char*, n) detected nullptr");
- __init(__s, __n);
- }
-
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
- basic_string(const _CharT* __s, size_type __n, const _Allocator& __a)
+ basic_string(const _CharT* __s, size_type __n, const _Allocator& __a = _Allocator())
_LIBCPP_DIAGNOSE_NULLPTR_IF(__n != 0 && __s == nullptr, " if n is not zero")
: __alloc_(__a) {
_LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "basic_string(const char*, n, allocator) detected nullptr");
__init(__s, __n);
}
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c) { __init(__n, __c); }
-
# if _LIBCPP_STD_VER >= 23
_LIBCPP_HIDE_FROM_ABI constexpr basic_string(
basic_string&& __str, size_type __pos, const _Allocator& __alloc = _Allocator())
@@ -1114,7 +1100,8 @@ public:
# endif
template <__enable_if_t<__is_allocator_v<_Allocator>, int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c, const _Allocator& __a)
+ _LIBCPP_HIDE_FROM_ABI
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(size_type __n, _CharT __c, const _Allocator& __a = _Allocator())
: __alloc_(__a) {
__init(__n, __c);
}
@@ -1153,29 +1140,16 @@ public:
__enable_if_t<__can_be_converted_to_string_view_v<_CharT, _Traits, _Tp> &&
!is_same<__remove_cvref_t<_Tp>, basic_string>::value,
int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const _Tp& __t) {
- __self_view __sv = __t;
- __init(__sv.data(), __sv.size());
- }
-
- template <class _Tp,
- __enable_if_t<__can_be_converted_to_string_view_v<_CharT, _Traits, _Tp> &&
- !is_same<__remove_cvref_t<_Tp>, basic_string>::value,
- int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const _Tp& __t, const allocator_type& __a)
+ _LIBCPP_HIDE_FROM_ABI
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit basic_string(const _Tp& __t, const allocator_type& __a = allocator_type())
: __alloc_(__a) {
__self_view __sv = __t;
__init(__sv.data(), __sv.size());
}
- template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(_InputIterator __first, _InputIterator __last) {
- __init(__first, __last);
- }
-
template <class _InputIterator, __enable_if_t<__has_input_iterator_category<_InputIterator>::value, int> = 0>
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
- basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a)
+ basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a = allocator_type())
: __alloc_(__a) {
__init(__first, __last);
}
@@ -1194,11 +1168,8 @@ public:
# endif
# ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il) {
- __init(__il.begin(), __il.end());
- }
-
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 basic_string(initializer_list<_CharT> __il, const _Allocator& __a)
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
+ basic_string(initializer_list<_CharT> __il, const _Allocator& __a = _Allocator())
: __alloc_(__a) {
__init(__il.begin(), __il.end());
}
More information about the libcxx-commits
mailing list