std::basic_string の推論ガイド
| ヘッダ <string> で定義 |
||
| template< class InputIt, class Alloc = std::allocator< typename std::iterator_traits<InputIt>::value_type> > |
(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を満たす場合にのみ、オーバーロード解決に参加します。size_typeパラメータ型は、推論ガイドによって推論される型のsize_typeメンバ型を参照します。これらのオーバーロードは、AllocがAllocatorを満たす場合にのみ、オーバーロード解決に参加します。注意: ライブラリが型がLegacyInputIteratorを満たさないと判断する範囲は未指定ですが、最低限、整数型は入力イテレータとして適格ではありません。同様に、型がAllocatorを満たさないと判断する範囲も未指定ですが、最低限、メンバ型Alloc::value_typeが存在し、評価されないオペランドとして扱われる場合、式std::declval<Alloc&>().allocate(std::size_t{})がwell-formedである必要があります。
目次 |
[編集] Notes
ガイド(2,3)は、std::basic_stringのstd::basic_string_view用のコンストラクタが、既存のコードでの曖昧さを避けるためにテンプレート化されており、それらのテンプレートがクラステンプレート引数推論をサポートしていないため必要です。
[編集] Notes
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Ranges対応の構築と挿入。オーバーロード(4) |
[編集] Example
#include <cassert> #include <string> #include <vector> int main() { std::vector<char> v = {'a', 'b', 'c'}; std::basic_string s1(v.begin(), v.end()); // uses deduction guide (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); // uses deduction guide (4) assert(s4 == L"C++23"); #endif }
[編集] Defect reports
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3075 | C++17 | basic_string_viewからの推論はサポートされていませんでした(LWG issue 2946により悪化)。 |
推論ガイドが追加されました |