This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++11 status.

### 1325. `bitset`

Section: 22.9.2.2 [bitset.cons] Status: C++11 Submitter: Christopher Jefferson Opened: 2010-03-07 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [bitset.cons].

View all issues with C++11 status.

Discussion:

As mentioned on the boost mailing list:

The following code, valid in C++03, is broken in C++0x due to ambiguity between the "`unsigned long long`" and "`char*`" constructors.

>     #include <bitset>
>     std::bitset<10> b(0);

[ The proposed resolution has been reviewed by Stephan T. Lavavej. ]

[ Post-Rapperswil ]

The proposed resolution has two problems:

- it fails to provide support for non-terminated strings, which could be easily added and constitutes an important use-case. For example, the following code would invoke UB with the current P/R:

  >     char s[4] = { '0', '1', '0', '1' }; // notice: not null-terminated!
  >     bitset<4> b(s, 0, 4);

  because it requires the evaluation (under the as-if rule, to be fair, but it doesn't matter) of `basic_string<char>(s)`

- it promotes a consistency between the two `bitset` constructors that take a `const std::string&` and a `const char*`, respectively, while practice established by `std::basic_string` would recommend a different set of parameters. In particular, the constructor of `std::basic_string` that takes a `const char*` does not have a `pos` parameter

> Moved to Tentatively Ready with revised wording provided by Alberto Ganesh Babati after 5 positive votes on c++std-lib.

[ Adopted at 2010-11 Batavia ]

Proposed resolution:

1. In the synopsis of header `<bitset>` in 22.9.2 [template.bitset]/1, replace the fourth bitset constructor:

   >     explicit bitset(const char *str);
   >     template <class charT>
   >       explicit bitset(
   >         const charT *str,
   >         typename basic_string<charT>::size_type n = basic_string<charT>::npos,
   >         charT zero = charT('0'), charT one = charT('1'));

2. In 22.9.2.2 [bitset.cons]/8:

   >     explicit bitset(const char *str);
   >     template <class charT>
   >     explicit
   >     bitset(const charT *str,
   >            typename basic_string<charT>::size_type n = basic_string<charT>::npos,
   >            charT zero = charT('0'), charT one = charT('1'));

   Effects: Constructs an object of class `bitset<N>` as if by bitset(string(str)).

   >     bitset(
   >       n == basic_string<charT>::npos
   >         ? basic_string<charT>(str)
   >         : basic_string<charT>(str, n),
   >       0, n, zero, one)