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

### 3020. [networking.ts] Remove spurious nested `value_type` buffer sequence requirement

Section: 16.2 [networking.ts::buffer.reqmts] Status: WP Submitter: Vinnie Falco Opened: 2017-09-20 Last modified: 2021-02-27

Priority: 0

View all other issues in [networking.ts::buffer.reqmts].

View all issues with WP status.

Discussion:

Addresses: networking.ts

The post-condition requirements for `ConstBufferSequence` and `MutableBufferSequence` refer to `X::value_type`, but no such nested type is required. The lambda expression passed to `equal` can use `auto const&` parameter types instead.

Previous resolution: [SUPERSEDED]

> This wording is relative to N4588.

> 1. Modify 16.2.1 [networking.ts::buffer.reqmts.mutablebuffersequence] Table 12 "`MutableBufferSequence` requirements" as indicated:

>    > Table 12 — `MutableBufferSequence` requirements
>    > expression | return type | assertion/note pre/post-condition
>    > --- | --- | ---
>    > `[…]`
>    > `X u(x);` |  | post:
>    >     equal(
>    >       net::buffer_sequence_begin(x),
>    >       net::buffer_sequence_end(x),
>    >       net::buffer_sequence_begin(u),
>    >       net::buffer_sequence_end(u),
>    >       [](const typename X::value_typeauto& v1,
>    >          const typename X::value_typeauto& v2)
>    >         {
>    >           mutable_buffer b1(v1);
>    >           mutable_buffer b2(v2);
>    >           return b1.data() == b2.data()
>    >               && b1.size() == b2.size();
>    >         })

> 2. Modify 16.2.2 [networking.ts::buffer.reqmts.constbuffersequence] Table 13 "`ConstBufferSequence` requirements" as indicated:

>    > Table 13 — `ConstBufferSequence` requirements
>    > expression | return type | assertion/note pre/post-condition
>    > --- | --- | ---
>    > `[…]`
>    > `X u(x);` |  | post:
>    >     equal(
>    >       net::buffer_sequence_begin(x),
>    >       net::buffer_sequence_end(x),
>    >       net::buffer_sequence_begin(u),
>    >       net::buffer_sequence_end(u),
>    >       [](const typename X::value_typeauto& v1,
>    >          const typename X::value_typeauto& v2)
>    >         {
>    >           const_buffer b1(v1);
>    >           const_buffer b2(v2);
>    >           return b1.data() == b2.data()
>    >               && b1.size() == b2.size();
>    >         })

[2017-10-19, Peter Dimov provides improved wording]

The alternative wording prevents the need for `auto` parameters because it takes advantage of the "convertible to" requirement.

[ 2017-10-20 Moved to Tentatively Ready after 5 positive votes on c++std-lib. ]

[2018-3-17 Adopted in Jacksonville]

Proposed resolution:

This wording is relative to N4588.

1. Modify 16.2.1 [networking.ts::buffer.reqmts.mutablebuffersequence] Table 12 "`MutableBufferSequence` requirements" as indicated:

   > Table 12 — `MutableBufferSequence` requirements
   > expression | return type | assertion/note pre/post-condition
   > --- | --- | ---
   > `[…]`
   > `X u(x);` |  | post:
   >     equal(
   >       net::buffer_sequence_begin(x),
   >       net::buffer_sequence_end(x),
   >       net::buffer_sequence_begin(u),
   >       net::buffer_sequence_end(u),
   >       [](const typename X::value_type& v1mutable_buffer& b1,
   >          const typename X::value_type& v2mutable_buffer& b2)
   >         {
   >           mutable_buffer b1(v1);
   >           mutable_buffer b2(v2);
   >           return b1.data() == b2.data()
   >               && b1.size() == b2.size();
   >         })

2. Modify 16.2.2 [networking.ts::buffer.reqmts.constbuffersequence] Table 13 "`ConstBufferSequence` requirements" as indicated:

   > Table 13 — `ConstBufferSequence` requirements
   > expression | return type | assertion/note pre/post-condition
   > --- | --- | ---
   > `[…]`
   > `X u(x);` |  | post:
   >     equal(
   >       net::buffer_sequence_begin(x),
   >       net::buffer_sequence_end(x),
   >       net::buffer_sequence_begin(u),
   >       net::buffer_sequence_end(u),
   >       [](const typename X::value_type& v1const_buffer& b1,
   >          const typename X::value_type& v2const_buffer& v2)
   >         {
   >           const_buffer b1(v1);
   >           const_buffer b2(v2);
   >           return b1.data() == b2.data()
   >               && b1.size() == b2.size();
   >         })