[format.parse.ctx]

# 28 Text processing library [[text]](./#text)

## 28.5 Formatting [[format]](format#parse.ctx)

### 28.5.6 Formatter [[format.formatter]](format.formatter#format.parse.ctx)

#### 28.5.6.6 Class template basic_format_parse_context [format.parse.ctx]

[ð](#lib:basic_format_parse_context)

namespace std {template<class charT>class basic_format_parse_context {public:using char_type = charT; using const_iterator = typename basic_string_view<charT>::const_iterator; using iterator = const_iterator; private: iterator begin_; // *exposition only* iterator end_; // *exposition only*enum indexing { unknown, manual, automatic }; // *exposition only* indexing indexing_; // *exposition only* size_t next_arg_id_; // *exposition only* size_t num_args_; // *exposition only*public:constexpr explicit basic_format_parse_context(basic_string_view<charT> fmt) noexcept;
 basic_format_parse_context(const basic_format_parse_context&) = delete;
 basic_format_parse_context& operator=(const basic_format_parse_context&) = delete; constexpr const_iterator begin() const noexcept; constexpr const_iterator end() const noexcept; constexpr void advance_to(const_iterator it); constexpr size_t next_arg_id(); constexpr void check_arg_id(size_t id); template<class... Ts>constexpr void check_dynamic_spec(size_t id) noexcept; constexpr void check_dynamic_spec_integral(size_t id) noexcept; constexpr void check_dynamic_spec_string(size_t id) noexcept; };}

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7482)

An instance of basic_format_parse_context holds
the format string parsing state, consisting of
the format string range being parsed and
the argument counter for automatic indexing[.](#1.sentence-1)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7488)

If a program declares an explicit or partial specialization ofbasic_format_parse_context,
the program is ill-formed, no diagnostic required[.](#2.sentence-1)

[ð](#lib:basic_format_parse_context,constructor)

`constexpr explicit basic_format_parse_context(basic_string_view<charT> fmt) noexcept;
`

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7499)

*Effects*: Initializesbegin_ with fmt.begin(),end_ with fmt.end(),indexing_ with unknown,next_arg_id_ with 0, andnum_args_ with 0[.](#3.sentence-1)

[*Note [1](#note-1)*:

Any call tonext_arg_id, check_arg_id, or check_dynamic_spec on an instance of basic_format_parse_context initialized using this constructor is not a core constant expression[.](#3.sentence-2)

â *end note*]

[ð](#lib:begin,basic_format_parse_context)

`constexpr const_iterator begin() const noexcept;
`

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7521)

*Returns*: begin_[.](#4.sentence-1)

[ð](#lib:end,basic_format_parse_context)

`constexpr const_iterator end() const noexcept;
`

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7532)

*Returns*: end_[.](#5.sentence-1)

[ð](#lib:advance_to,basic_format_parse_context)

`constexpr void advance_to(const_iterator it);
`

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7543)

*Preconditions*: end() is reachable from it[.](#6.sentence-1)

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7547)

*Effects*: Equivalent to: begin_ = it;

[ð](#lib:next_arg_id,basic_format_parse_context)

`constexpr size_t next_arg_id();
`

[8](#8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7558)

*Effects*: If indexing_ != manual is true, equivalent to:if (indexing_ == unknown) indexing_ = automatic;return next_arg_id_++;

[9](#9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7567)

*Throws*: format_error if indexing_ == manual is true[.](#9.sentence-1)

[*Note [2](#note-2)*:

This indicates mixing of automatic and manual argument indexing[.](#9.sentence-2)

â *end note*]

[10](#10)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7574)

*Remarks*: Let *cur-arg-id* be the value of next_arg_id_ prior to this call[.](#10.sentence-1)

Call expressions where *cur-arg-id* >= num_args_ is true are not core constant expressions ([[expr.const]](expr.const "7.7 Constant expressions"))[.](#10.sentence-2)

[ð](#lib:check_arg_id,basic_format_parse_context)

`constexpr void check_arg_id(size_t id);
`

[11](#11)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7587)

*Effects*: If indexing_ != automatic is true, equivalent to:if (indexing_ == unknown) indexing_ = manual;

[12](#12)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7595)

*Throws*: format_error ifindexing_ == automatic is true[.](#12.sentence-1)

[*Note [3](#note-3)*:

This indicates mixing of automatic and manual argument indexing[.](#12.sentence-2)

â *end note*]

[13](#13)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7603)

*Remarks*: A call to this function is a core constant expression ([[expr.const]](expr.const "7.7 Constant expressions")) only ifid < num_args_ is true[.](#13.sentence-1)

[ð](#lib:check_dynamic_spec,basic_format_parse_context)

`template<class... Ts>
  constexpr void check_dynamic_spec(size_t id) noexcept;
`

[14](#14)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7616)

*Mandates*: sizeof...(Ts) â¥ 1[.](#14.sentence-1)

The types in Ts... are unique[.](#14.sentence-2)

Each type in Ts... is one ofbool,char_type,int,unsigned int,long long int,unsigned long long int,float,double,long double,const char_type*,basic_string_view<char_type>, orconst void*[.](#14.sentence-3)

[15](#15)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7634)

*Remarks*: A call to this function is a core constant expression only if

- [(15.1)](#15.1)

id < num_args_ is true and

- [(15.2)](#15.2)

the type of the corresponding format argument
(after conversion to basic_format_arg<Context>) is one of the types in Ts...[.](#15.sentence-1)

[ð](#lib:check_dynamic_spec_integral,basic_format_parse_context)

`constexpr void check_dynamic_spec_integral(size_t id) noexcept;
`

[16](#16)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7652)

*Effects*: Equivalent to:check_dynamic_spec<int, unsigned int, long long int, unsigned long long int>(id);

[ð](#lib:check_dynamic_spec_string,basic_format_parse_context)

`constexpr void check_dynamic_spec_string(size_t id) noexcept;
`

[17](#17)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L7666)

*Effects*: Equivalent to:check_dynamic_spec<const char_type*, basic_string_view<char_type>>(id);
