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 { } ) が未評価オペランドとして扱われた場合に well-formed でなければならない。

注記

機能テスト マクロ 標準 機能
__cpp_lib_containers_ranges 202202L (C++23) レンジ対応 構築と挿入; オーバーロード (2)

#include <vector>
int main()
{
    std::vector<int> v = {1, 2, 3, 4};
    // 明示的なdeduction guideを使用してstd::vector<int>を推論
    std::vector x(v.begin(), v.end());
    // std::vector<std::vector<int>::iterator>を推論
    // リスト初期化の第一段階のオーバーロード解決では、初期化子リストコンストラクタから
    // 合成された候補が選択され、第二段階は実行されず、deduction guideは効果を持たない
    std::vector y{v.begin(), v.end()};
}