std::basic_string 的推导指引

来自cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
定义于头文件 <string>
template<class InputIt, class Alloc = std::allocator<

                          typename std::iterator_traits<InputIt>::value_type>>
basic_string(InputIt, InputIt, Alloc = Alloc())
-> basic_string<typename std::iterator_traits<InputIt>::value_type,
                std::char_traits<typename std::iterator_traits<InputIt>::value_type>,

                Alloc>;
(C++17 起)
定义于头文件 <string>
template<class InputIt, class Alloc = std::allocator<

                          typename std::iterator_traits<InputIt>::value_type>>
basic_string(InputIt, InputIt, Alloc = Alloc())
-> basic_string<typename std::iterator_traits<InputIt>::value_type,
                std::char_traits<typename std::iterator_traits<InputIt>::value_type>,

                Alloc>;
(1) (C++17 起)
template<class CharT,

         class Traits,
         class Alloc = std::allocator<CharT>>
explicit basic_string(std::basic_string_view<CharT, Traits>, const Alloc& = Alloc())

-> basic_string<CharT, Traits, Alloc>;
(2) (C++17 起)
template<class CharT,

         class Traits,
         class Alloc = std::allocator<CharT>>>
basic_string(std::basic_string_view<CharT, Traits>, typename /*see below*/::size_type,
             typename /*see below*/::size_type, const Alloc& = Alloc())

    -> basic_string<CharT, Traits, Alloc>;
(3) (C++17 起)
1)std::basic_string 提供此推导指引,以允许从迭代器范围推导。此重载仅若 InputIt 满足遗留输入迭代器 (LegacyInputIterator) Alloc 满足分配器 (Allocator) 才参与重载决议。
2-3)std::basic_string 提供这些推导指引以允许从 std::basic_string_view 推导。 (3) 中的size_type 参数指代推导指引所推出类型的 size_type 成员类型。这些重载仅若 Alloc 满足分配器 (Allocator) 才参与重载决议。

注意:库确定类型是否满足遗留输入迭代器 (LegacyInputIterator) 的程度是未指定的,除了最低要求是整数类型不具备输入迭代器的条件。类似地,确定类型是否满足分配器 (Allocator) 是未指定的,除了最低要求是成员类型 Alloc::value_type 必须存在,且表达式 std::declval<Alloc&>().allocate(std::size_t{}) 在作为不求值运算数时必须为良式。

[编辑] 注意

需要指引 (2-3) ,因为 std::basic_string 对于 std::basic_string_view 的构造函数被设为模板,以避免既存代码中的歧义,而这些模板不支持类模板实参推导。

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 3075 C++17 不支持从 basic_string_view 推导(为 LWG 问题 2946 所恶化) 添加推导指引

[编辑] 示例

#include <string>
#include <vector>
int main() {
   std::vector<char> v = {'a', 'b', 'c'};
   std::basic_string s(v.begin(), v.end()); // 使用显式推导指引
}