Skip to content

Commit e36cd33

Browse files
authored
Merge 2018-11 LWG Motion 11
P1032R1 Misc constexpr bits Fixes #2417
2 parents 9e96020 + ae57182 commit e36cd33

File tree

5 files changed

+167
-143
lines changed

5 files changed

+167
-143
lines changed

source/containers.tex

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,10 @@
463463
for some types of containers but not others. Those containers for which the
464464
listed operations are provided shall implement the semantics described in
465465
\tref{containers.optional.operations} unless otherwise stated.
466+
If the iterators passed to \tcode{lexicographical_compare}
467+
satisfy the constexpr iterator requirements\iref{iterator.requirements.general}
468+
then the operations described in \tref{containers.optional.operations}
469+
are implemented by constexpr functions.
466470

467471
\begin{libreqtab5}
468472
{Optional container operations}
@@ -3009,7 +3013,7 @@
30093013
template<class T, size_t N>
30103014
constexpr bool operator>=(const array<T, N>& x, const array<T, N>& y);
30113015
template<class T, size_t N>
3012-
void swap(array<T, N>& x, array<T, N>& y) noexcept(noexcept(x.swap(y)));
3016+
constexpr void swap(array<T, N>& x, array<T, N>& y) noexcept(noexcept(x.swap(y)));
30133017

30143018
template<class T> class tuple_size;
30153019
template<size_t I, class T> class tuple_element;
@@ -3235,8 +3239,8 @@
32353239

32363240
// no explicit construct/copy/destroy for aggregate type
32373241

3238-
void fill(const T& u);
3239-
void swap(array&) noexcept(is_nothrow_swappable_v<T>);
3242+
constexpr void fill(const T& u);
3243+
constexpr void swap(array&) noexcept(is_nothrow_swappable_v<T>);
32403244

32413245
// iterators
32423246
constexpr iterator begin() noexcept;
@@ -3326,7 +3330,7 @@
33263330

33273331
\indexlibrarymember{array}{fill}%
33283332
\begin{itemdecl}
3329-
void fill(const T& u);
3333+
constexpr void fill(const T& u);
33303334
\end{itemdecl}
33313335

33323336
\begin{itemdescr}
@@ -3336,7 +3340,7 @@
33363340

33373341
\indexlibrarymember{array}{swap}%
33383342
\begin{itemdecl}
3339-
void swap(array& y) noexcept(is_nothrow_swappable_v<T>);
3343+
constexpr void swap(array& y) noexcept(is_nothrow_swappable_v<T>);
33403344
\end{itemdecl}
33413345

33423346
\begin{itemdescr}
@@ -3356,7 +3360,7 @@
33563360
\indexlibrarymember{array}{swap}%
33573361
\begin{itemdecl}
33583362
template<class T, size_t N>
3359-
void swap(array<T, N>& x, array<T, N>& y) noexcept(noexcept(x.swap(y)));
3363+
constexpr void swap(array<T, N>& x, array<T, N>& y) noexcept(noexcept(x.swap(y)));
33603364
\end{itemdecl}
33613365

33623366
\begin{itemdescr}

source/iterators.tex

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -768,15 +768,16 @@
768768

769769
template<class Container> class back_insert_iterator;
770770
template<class Container>
771-
back_insert_iterator<Container> back_inserter(Container& x);
771+
constexpr back_insert_iterator<Container> back_inserter(Container& x);
772772

773773
template<class Container> class front_insert_iterator;
774774
template<class Container>
775-
front_insert_iterator<Container> front_inserter(Container& x);
775+
constexpr front_insert_iterator<Container> front_inserter(Container& x);
776776

777777
template<class Container> class insert_iterator;
778778
template<class Container>
779-
insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
779+
constexpr insert_iterator<Container>
780+
inserter(Container& x, typename Container::iterator i);
780781

781782
template<class Iterator> class move_iterator;
782783
template<class Iterator1, class Iterator2>
@@ -1704,25 +1705,25 @@
17041705
using reference = void;
17051706
using container_type = Container;
17061707

1707-
explicit back_insert_iterator(Container& x);
1708-
back_insert_iterator& operator=(const typename Container::value_type& value);
1709-
back_insert_iterator& operator=(typename Container::value_type&& value);
1708+
constexpr explicit back_insert_iterator(Container& x);
1709+
constexpr back_insert_iterator& operator=(const typename Container::value_type& value);
1710+
constexpr back_insert_iterator& operator=(typename Container::value_type&& value);
17101711

1711-
back_insert_iterator& operator*();
1712-
back_insert_iterator& operator++();
1713-
back_insert_iterator operator++(int);
1712+
constexpr back_insert_iterator& operator*();
1713+
constexpr back_insert_iterator& operator++();
1714+
constexpr back_insert_iterator operator++(int);
17141715
};
17151716

17161717
template<class Container>
1717-
back_insert_iterator<Container> back_inserter(Container& x);
1718+
constexpr back_insert_iterator<Container> back_inserter(Container& x);
17181719
}
17191720
\end{codeblock}
17201721

17211722
\rSec4[back.insert.iter.ops]{Operations}
17221723

17231724
\indexlibrary{\idxcode{back_insert_iterator}!constructor}%
17241725
\begin{itemdecl}
1725-
explicit back_insert_iterator(Container& x);
1726+
constexpr explicit back_insert_iterator(Container& x);
17261727
\end{itemdecl}
17271728

17281729
\begin{itemdescr}
@@ -1735,7 +1736,7 @@
17351736

17361737
\indexlibrarymember{operator=}{back_insert_iterator}%
17371738
\begin{itemdecl}
1738-
back_insert_iterator& operator=(const typename Container::value_type& value);
1739+
constexpr back_insert_iterator& operator=(const typename Container::value_type& value);
17391740
\end{itemdecl}
17401741

17411742
\begin{itemdescr}
@@ -1750,7 +1751,7 @@
17501751

17511752
\indexlibrarymember{operator=}{back_insert_iterator}%
17521753
\begin{itemdecl}
1753-
back_insert_iterator& operator=(typename Container::value_type&& value);
1754+
constexpr back_insert_iterator& operator=(typename Container::value_type&& value);
17541755
\end{itemdecl}
17551756

17561757
\begin{itemdescr}
@@ -1765,7 +1766,7 @@
17651766

17661767
\indexlibrarymember{operator*}{back_insert_iterator}%
17671768
\begin{itemdecl}
1768-
back_insert_iterator& operator*();
1769+
constexpr back_insert_iterator& operator*();
17691770
\end{itemdecl}
17701771

17711772
\begin{itemdescr}
@@ -1776,8 +1777,8 @@
17761777

17771778
\indexlibrarymember{operator++}{back_insert_iterator}%
17781779
\begin{itemdecl}
1779-
back_insert_iterator& operator++();
1780-
back_insert_iterator operator++(int);
1780+
constexpr back_insert_iterator& operator++();
1781+
constexpr back_insert_iterator operator++(int);
17811782
\end{itemdecl}
17821783

17831784
\begin{itemdescr}
@@ -1791,7 +1792,7 @@
17911792
\indexlibrary{\idxcode{back_inserter}}%
17921793
\begin{itemdecl}
17931794
template<class Container>
1794-
back_insert_iterator<Container> back_inserter(Container& x);
1795+
constexpr back_insert_iterator<Container> back_inserter(Container& x);
17951796
\end{itemdecl}
17961797

17971798
\begin{itemdescr}
@@ -1818,25 +1819,25 @@
18181819
using reference = void;
18191820
using container_type = Container;
18201821

1821-
explicit front_insert_iterator(Container& x);
1822-
front_insert_iterator& operator=(const typename Container::value_type& value);
1823-
front_insert_iterator& operator=(typename Container::value_type&& value);
1822+
constexpr explicit front_insert_iterator(Container& x);
1823+
constexpr front_insert_iterator& operator=(const typename Container::value_type& value);
1824+
constexpr front_insert_iterator& operator=(typename Container::value_type&& value);
18241825

1825-
front_insert_iterator& operator*();
1826-
front_insert_iterator& operator++();
1827-
front_insert_iterator operator++(int);
1826+
constexpr front_insert_iterator& operator*();
1827+
constexpr front_insert_iterator& operator++();
1828+
constexpr front_insert_iterator operator++(int);
18281829
};
18291830

18301831
template<class Container>
1831-
front_insert_iterator<Container> front_inserter(Container& x);
1832+
constexpr front_insert_iterator<Container> front_inserter(Container& x);
18321833
}
18331834
\end{codeblock}
18341835

18351836
\rSec4[front.insert.iter.ops]{Operations}
18361837

18371838
\indexlibrary{\idxcode{front_insert_iterator}!constructor}%
18381839
\begin{itemdecl}
1839-
explicit front_insert_iterator(Container& x);
1840+
constexpr explicit front_insert_iterator(Container& x);
18401841
\end{itemdecl}
18411842

18421843
\begin{itemdescr}
@@ -1849,7 +1850,7 @@
18491850

18501851
\indexlibrarymember{operator=}{front_insert_iterator}%
18511852
\begin{itemdecl}
1852-
front_insert_iterator& operator=(const typename Container::value_type& value);
1853+
constexpr front_insert_iterator& operator=(const typename Container::value_type& value);
18531854
\end{itemdecl}
18541855

18551856
\begin{itemdescr}
@@ -1864,7 +1865,7 @@
18641865

18651866
\indexlibrarymember{operator=}{front_insert_iterator}%
18661867
\begin{itemdecl}
1867-
front_insert_iterator& operator=(typename Container::value_type&& value);
1868+
constexpr front_insert_iterator& operator=(typename Container::value_type&& value);
18681869
\end{itemdecl}
18691870

18701871
\begin{itemdescr}
@@ -1879,7 +1880,7 @@
18791880

18801881
\indexlibrarymember{operator*}{front_insert_iterator}%
18811882
\begin{itemdecl}
1882-
front_insert_iterator& operator*();
1883+
constexpr front_insert_iterator& operator*();
18831884
\end{itemdecl}
18841885

18851886
\begin{itemdescr}
@@ -1890,8 +1891,8 @@
18901891

18911892
\indexlibrarymember{operator++}{front_insert_iterator}%
18921893
\begin{itemdecl}
1893-
front_insert_iterator& operator++();
1894-
front_insert_iterator operator++(int);
1894+
constexpr front_insert_iterator& operator++();
1895+
constexpr front_insert_iterator operator++(int);
18951896
\end{itemdecl}
18961897

18971898
\begin{itemdescr}
@@ -1905,7 +1906,7 @@
19051906
\indexlibrary{\idxcode{front_inserter}}%
19061907
\begin{itemdecl}
19071908
template<class Container>
1908-
front_insert_iterator<Container> front_inserter(Container& x);
1909+
constexpr front_insert_iterator<Container> front_inserter(Container& x);
19091910
\end{itemdecl}
19101911

19111912
\begin{itemdescr}
@@ -1933,25 +1934,26 @@
19331934
using reference = void;
19341935
using container_type = Container;
19351936

1936-
insert_iterator(Container& x, typename Container::iterator i);
1937-
insert_iterator& operator=(const typename Container::value_type& value);
1938-
insert_iterator& operator=(typename Container::value_type&& value);
1937+
constexpr insert_iterator(Container& x, typename Container::iterator i);
1938+
constexpr insert_iterator& operator=(const typename Container::value_type& value);
1939+
constexpr insert_iterator& operator=(typename Container::value_type&& value);
19391940

1940-
insert_iterator& operator*();
1941-
insert_iterator& operator++();
1942-
insert_iterator& operator++(int);
1941+
constexpr insert_iterator& operator*();
1942+
constexpr insert_iterator& operator++();
1943+
constexpr insert_iterator& operator++(int);
19431944
};
19441945

19451946
template<class Container>
1946-
insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
1947+
constexpr insert_iterator<Container>
1948+
inserter(Container& x, typename Container::iterator i);
19471949
}
19481950
\end{codeblock}
19491951

19501952
\rSec4[insert.iter.ops]{Operations}
19511953

19521954
\indexlibrary{\idxcode{insert_iterator}!constructor}%
19531955
\begin{itemdecl}
1954-
insert_iterator(Container& x, typename Container::iterator i);
1956+
constexpr insert_iterator(Container& x, typename Container::iterator i);
19551957
\end{itemdecl}
19561958

19571959
\begin{itemdescr}
@@ -1966,7 +1968,7 @@
19661968

19671969
\indexlibrarymember{operator=}{insert_iterator}%
19681970
\begin{itemdecl}
1969-
insert_iterator& operator=(const typename Container::value_type& value);
1971+
constexpr insert_iterator& operator=(const typename Container::value_type& value);
19701972
\end{itemdecl}
19711973

19721974
\begin{itemdescr}
@@ -1985,7 +1987,7 @@
19851987

19861988
\indexlibrarymember{operator=}{insert_iterator}%
19871989
\begin{itemdecl}
1988-
insert_iterator& operator=(typename Container::value_type&& value);
1990+
constexpr insert_iterator& operator=(typename Container::value_type&& value);
19891991
\end{itemdecl}
19901992

19911993
\begin{itemdescr}
@@ -2004,7 +2006,7 @@
20042006

20052007
\indexlibrarymember{operator*}{insert_iterator}%
20062008
\begin{itemdecl}
2007-
insert_iterator& operator*();
2009+
constexpr insert_iterator& operator*();
20082010
\end{itemdecl}
20092011

20102012
\begin{itemdescr}
@@ -2015,8 +2017,8 @@
20152017

20162018
\indexlibrarymember{operator++}{insert_iterator}%
20172019
\begin{itemdecl}
2018-
insert_iterator& operator++();
2019-
insert_iterator& operator++(int);
2020+
constexpr insert_iterator& operator++();
2021+
constexpr insert_iterator& operator++(int);
20202022
\end{itemdecl}
20212023

20222024
\begin{itemdescr}
@@ -2030,7 +2032,8 @@
20302032
\indexlibrary{\idxcode{inserter}}%
20312033
\begin{itemdecl}
20322034
template<class Container>
2033-
insert_iterator<Container> inserter(Container& x, typename Container::iterator i);
2035+
constexpr insert_iterator<Container>
2036+
inserter(Container& x, typename Container::iterator i);
20342037
\end{itemdecl}
20352038

20362039
\begin{itemdescr}

source/strings.tex

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,9 @@
333333
static constexpr size_t length(const char_type* s);
334334
static constexpr const char_type* find(const char_type* s, size_t n,
335335
const char_type& a);
336-
static char_type* move(char_type* s1, const char_type* s2, size_t n);
337-
static char_type* copy(char_type* s1, const char_type* s2, size_t n);
338-
static char_type* assign(char_type* s, size_t n, char_type a);
336+
static constexpr char_type* move(char_type* s1, const char_type* s2, size_t n);
337+
static constexpr char_type* copy(char_type* s1, const char_type* s2, size_t n);
338+
static constexpr char_type* assign(char_type* s, size_t n, char_type a);
339339

340340
static constexpr int_type not_eof(int_type c) noexcept;
341341
static constexpr char_type to_char_type(int_type c) noexcept;
@@ -457,9 +457,9 @@
457457
static constexpr size_t length(const char_type* s);
458458
static constexpr const char_type* find(const char_type* s, size_t n,
459459
const char_type& a);
460-
static char_type* move(char_type* s1, const char_type* s2, size_t n);
461-
static char_type* copy(char_type* s1, const char_type* s2, size_t n);
462-
static char_type* assign(char_type* s, size_t n, char_type a);
460+
static constexpr char_type* move(char_type* s1, const char_type* s2, size_t n);
461+
static constexpr char_type* copy(char_type* s1, const char_type* s2, size_t n);
462+
static constexpr char_type* assign(char_type* s, size_t n, char_type a);
463463

464464
static constexpr int_type not_eof(int_type c) noexcept;
465465
static constexpr char_type to_char_type(int_type c) noexcept;
@@ -507,9 +507,9 @@
507507
static constexpr size_t length(const char_type* s);
508508
static constexpr const char_type* find(const char_type* s, size_t n,
509509
const char_type& a);
510-
static char_type* move(char_type* s1, const char_type* s2, size_t n);
511-
static char_type* copy(char_type* s1, const char_type* s2, size_t n);
512-
static char_type* assign(char_type* s, size_t n, char_type a);
510+
static constexpr char_type* move(char_type* s1, const char_type* s2, size_t n);
511+
static constexpr char_type* copy(char_type* s1, const char_type* s2, size_t n);
512+
static constexpr char_type* assign(char_type* s, size_t n, char_type a);
513513

514514
static constexpr int_type not_eof(int_type c) noexcept;
515515
static constexpr char_type to_char_type(int_type c) noexcept;
@@ -557,9 +557,9 @@
557557
static constexpr size_t length(const char_type* s);
558558
static constexpr const char_type* find(const char_type* s, size_t n,
559559
const char_type& a);
560-
static char_type* move(char_type* s1, const char_type* s2, size_t n);
561-
static char_type* copy(char_type* s1, const char_type* s2, size_t n);
562-
static char_type* assign(char_type* s, size_t n, char_type a);
560+
static constexpr char_type* move(char_type* s1, const char_type* s2, size_t n);
561+
static constexpr char_type* copy(char_type* s1, const char_type* s2, size_t n);
562+
static constexpr char_type* assign(char_type* s, size_t n, char_type a);
563563

564564
static constexpr int_type not_eof(int_type c) noexcept;
565565
static constexpr char_type to_char_type(int_type c) noexcept;
@@ -4997,7 +4997,7 @@
49974997
constexpr void swap(basic_string_view& s) noexcept;
49984998

49994999
// \ref{string.view.ops}, string operations
5000-
size_type copy(charT* s, size_type n, size_type pos = 0) const;
5000+
constexpr size_type copy(charT* s, size_type n, size_type pos = 0) const;
50015001

50025002
constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;
50035003

@@ -5392,7 +5392,7 @@
53925392

53935393
\indexlibrarymember{copy}{basic_string_view}%
53945394
\begin{itemdecl}
5395-
size_type copy(charT* s, size_type n, size_type pos = 0) const;
5395+
constexpr size_type copy(charT* s, size_type n, size_type pos = 0) const;
53965396
\end{itemdecl}
53975397

53985398
\begin{itemdescr}

0 commit comments

Comments
 (0)