Namespaces
Variants

deduction guides for std::vector

From cppreference.net

定义于头文件 <vector>
template < class InputIt,

class Alloc = std:: allocator <
typename std:: iterator_traits < InputIt > :: value_type > >
vector ( InputIt, InputIt, Alloc = Alloc ( ) )

- > vector < typename std:: iterator_traits < InputIt > :: value_type , Alloc > ;
(1) (C++17 起)
template < ranges:: input_range R,

class Alloc = std:: allocator < ranges:: range_value_t < R >> >
vector ( std:: from_range_t , R && , Alloc = Alloc ( ) )

- > vector < ranges:: range_value_t < R > , Alloc > ;
(2) (C++23 起)
1) 推导指引 为 vector 提供,允许从迭代器范围进行推导。此重载仅当 InputIt 满足 LegacyInputIterator Alloc 满足 Allocator 时参与重载决议。
2) 此推导指南为 vector 提供,允许从 std::from_range_t 标签和 input_range 进行推导。

注意:库判定某个类型不满足 LegacyInputIterator 要求的程度是未指定的,但至少整型类型不符合输入迭代器的要求。同样地,库判定某个类型不满足 Allocator 要求的程度也是未指定的,但至少要求成员类型 Alloc::value_type 必须存在,且表达式 std:: declval < Alloc & > ( ) . allocate ( std:: size_t { } ) 在作为未求值操作数处理时必须合法。

注释

功能测试 标准 功能特性
__cpp_lib_containers_ranges 202202L (C++23) 支持范围 的构造与插入;重载 (2)

示例

#include <vector>
int main()
{
    std::vector<int> v = {1, 2, 3, 4};
    // 使用显式推导指南推导 std::vector<int>
    std::vector x(v.begin(), v.end());
    // 推导出 std::vector<std::vector<int>::iterator>
    // 列表初始化的重载决议第一阶段选择从初始化列表构造函数合成的候选函数
    // 第二阶段未执行,推导指南不生效
    std::vector y{v.begin(), v.end()};
}