[ PATCH ] C++20 <span>

Jonathan Wakely jwakely@redhat.com
Fri Aug 30 19:41:00 GMT 2019

On 30/08/19 15:22 -0400, JeanHeyd Meneide wrote:
>This patch implements <span> as it currently exists in the C++20 Working Draft.


>- __gnu_cxx::__normal_iterator is not fully constexpr, so its not used here

I'd prefer to make __normal_iterator constexpr, and use it.
It needs to be constexpr anyway for string and vector.

>- P1394 might be slated to end up in C++20 per National Body Comments.
>Therefore, an early implementation is left in an
>implementation-defined _GLIBCXX_P1394 define.
>2019-08-30  JeanHeyd "ThePhD" Meneide  <phdofthehouse@gmail.com>
>        * include/std/span: Implement the entirety of span.
>        * include/bits/range_access.h: Add __adl_* versions of access functions.
>        * testsuite/23_containers/span/everything.cc: constexpr and
>non-constexpr tests.
>        * include/Makefile.in: Add span to install.
>        * include/Makefile.am: Likewise

>+++ b/libstdc++-v3/include/std/span
>@@ -0,0 +1,549 @@
>+// Components for manipulating non-owning sequences of objects -*- C++ -*-
>+// Copyright (C) 2019-2019 Free Software Foundation, Inc.

Just 2019 please, not 2019-2019.

>+// WARNING: they forgot this feature test macro
>+// get on someone's back about it in Belfast!!!

Please use FIXME: instead of WARNING: (for consistency with the rest
of the sources, so people grepping for FIXME: can find this).

The new feature test macro should be in <version> too.

There's no need to qualify ::std::true_type and ::std::size_t when
within namespace std already. There's no ADL for type names, and
normal unqualified lookup will find the right ones (and is easier to

>+      static_assert(
>+        _Count == ::std::dynamic_extent || _Extent == ::std::dynamic_extent || _Count <= _Extent,
>+        "bad span length");

There are a number of lines that are too long, they need to be broken
before 80 columns.

Our static_assert messages should be stated as the positive condition
that is being asserted. So the diagnostic reads like
"assertion failed: thing being asserted"

So "bad span length" makes it look like we asserted the length is bad,
but actually it was good. I prefer to write something saying "X must
be true", e.g. "count must be equal to dynamic_extent, or less than
the span's extent".

Do we need to check _Extent == ::std::dynamic_extent here, give nthat
if it's true then _Count <= _Extent will be true as well?

>+  std::vector<std::int_least32_t> value{ 0 };

Your new testcase uses std::vector without including <vector>.

More information about the Libstdc++ mailing list