deduction guides for
std::basic_string
|
定义于头文件
<string>
|
||
|
template
<
class
InputIt,
class
Alloc
=
std::
allocator
<
typename
std::
iterator_traits
|
(1) | (C++17 起) |
|
template
<
class
CharT,
class
Traits,
|
(2) | (C++17 起) |
|
template
<
class
CharT,
class
Traits,
|
(3) | (C++17 起) |
|
template
<
ranges::
input_range
R,
class
Alloc
=
std::
allocator
<
ranges::
range_value_t
<
R
>>
>
|
(4) | (C++23 起) |
InputIt
满足
LegacyInputIterator
且
Alloc
满足
Allocator
时参与重载决议。
Alloc
满足
Allocator
要求时参与重载决议。
size_type
参数类型指代由推导指南推导出的类型中的嵌套类型
size_type
。
注意:库判定某个类型不满足
LegacyInputIterator
要求的程度是未指定的,但至少整型类型不符合输入迭代器的要求。同样地,库判定某个类型不满足
Allocator
要求的程度也是未指定的,但至少成员类型
Alloc::value_type
必须存在,且表达式
std::
declval
<
Alloc
&
>
(
)
.
allocate
(
std::
size_t
{
}
)
在作为未求值操作数处理时必须良构。
目录 |
注释
需要推导指引 ( 2,3 ) 是因为 std::basic_string 针对 std::basic_string_view 的构造函数被实现为模板,以避免在现有代码中引发歧义,而这些模板不支持类模板实参推导。
注释
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | 范围感知 的构造与插入;重载 ( 4 ) |
示例
#include <cassert> #include <string> #include <vector> int main() { std::vector<char> v = {'a', 'b', 'c'}; std::basic_string s1(v.begin(), v.end()); // 使用推导指南 (1) assert(s1 == "abc"); #if __cpp_lib_containers_ranges >= 202202L std::vector<wchar_t> v4{0x43, 43, 053, 0x32, 0x33}; std::basic_string s4(std::from_range, v4); // 使用推导指南 (4) assert(s4 == L"C++23"); #endif }
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 3075 | C++17 |
不支持从
basic_string_view
进行推导
(因 LWG 问题 2946 加剧) |
已添加推导指南 |