Skip to content

P0602R4 variant and optional should propagate copy/move triviality #2458

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 26, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 36 additions & 15 deletions source/utilities.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2224,8 +2224,8 @@

// \ref{optional.assign}, assignment
optional& operator=(nullopt_t) noexcept;
optional& operator=(const optional&);
optional& operator=(optional&&) noexcept(@\seebelow@);
constexpr optional& operator=(const optional&);
constexpr optional& operator=(optional&&) noexcept(@\seebelow@);
template<class U = T> optional& operator=(U&&);
template<class U> optional& operator=(const optional<U>&);
template<class U> optional& operator=(optional<U>&&);
Expand Down Expand Up @@ -2325,7 +2325,7 @@
This constructor shall be defined as deleted unless
\tcode{is_copy_constructible_v<T>} is \tcode{true}.
If \tcode{is_trivially_copy_constructible_v<T>} is \tcode{true},
this constructor shall be a \tcode{constexpr} constructor.
this constructor is trivial..
\end{itemdescr}

\indexlibrary{\idxcode{optional}!constructor}%
Expand Down Expand Up @@ -2355,7 +2355,7 @@
This constructor shall not participate in overload resolution
unless \tcode{is_move_constructible_v<T>} is \tcode{true}.
If \tcode{is_trivially_move_constructible_v<T>} is \tcode{true},
this constructor shall be a \tcode{constexpr} constructor.
this constructor is trivial.
\end{itemdescr}

\indexlibrary{\idxcode{optional}!constructor}%
Expand Down Expand Up @@ -2565,7 +2565,7 @@

\indexlibrarymember{operator=}{optional}%
\begin{itemdecl}
optional<T>& operator=(const optional& rhs);
constexpr optional<T>& operator=(const optional& rhs);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -2603,11 +2603,15 @@
This operator shall be defined as deleted unless
\tcode{is_copy_constructible_v<T>} is \tcode{true} and
\tcode{is_copy_assignable_v<T>} is \tcode{true}.
If \tcode{is_trivially_copy_constructible_v<T> \&\&}
\tcode{is_trivially_copy_assignable_v<T> \&\&}
\tcode{is_trivially_destructible_v<T>} is \tcode{true},
this assignment operator is trivial.
\end{itemdescr}

\indexlibrarymember{operator=}{optional}%
\begin{itemdecl}
optional<T>& operator=(optional&& rhs) noexcept(@\seebelow@);
constexpr optional<T>& operator=(optional&& rhs) noexcept(@\seebelow@);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -2653,6 +2657,10 @@
This operator shall not participate in overload resolution unless
\tcode{is_move_constructible_v<T>} is \tcode{true} and
\tcode{is_move_assignable_v<T>} is \tcode{true}.
If \tcode{is_trivially_move_constructible_v<T> \&\&}
\tcode{is_trivially_move_assignable_v<T> \&\&}
\tcode{is_trivially_destructible_v<T>} is \tcode{true},
this assignment operator is trivial.
\end{itemdescr}

\indexlibrarymember{operator=}{optional}%
Expand Down Expand Up @@ -3803,8 +3811,8 @@
public:
// \ref{variant.ctor}, constructors
constexpr variant() noexcept(@\seebelow@);
variant(const variant&);
variant(variant&&) noexcept(@\seebelow@);
constexpr variant(const variant&);
constexpr variant(variant&&) noexcept(@\seebelow@);

template<class T>
constexpr variant(T&&) noexcept(@\seebelow@);
Expand All @@ -3823,8 +3831,8 @@
~variant();

// \ref{variant.assign}, assignment
variant& operator=(const variant&);
variant& operator=(variant&&) noexcept(@\seebelow@);
constexpr variant& operator=(const variant&);
constexpr variant& operator=(variant&&) noexcept(@\seebelow@);

template<class T> variant& operator=(T&&) noexcept(@\seebelow@);

Expand Down Expand Up @@ -3908,7 +3916,7 @@

\indexlibrary{\idxcode{variant}!constructor}%
\begin{itemdecl}
variant(const variant& w);
constexpr variant(const variant& w);
\end{itemdecl}

\begin{itemdescr}
Expand All @@ -3927,11 +3935,13 @@
\remarks
This constructor shall be defined as deleted unless
\tcode{is_copy_constructible_v<$\tcode{T}_i$>} is \tcode{true} for all $i$.
If \tcode{is_trivially_copy_constructible_v<$\tcode{T}_i$>}
is \tcode{true} for all $i$, this constructor is trivial.
\end{itemdescr}

\indexlibrary{\idxcode{variant}!constructor}%
\begin{itemdecl}
variant(variant&& w) noexcept(@\seebelow@);
constexpr variant(variant&& w) noexcept(@\seebelow@);
\end{itemdecl}

\begin{itemdescr}
Expand All @@ -3952,6 +3962,8 @@
\tcode{is_nothrow_move_constructible_v<$\tcode{T}_i$>} for all $i$.
This function shall not participate in overload resolution unless
\tcode{is_move_constructible_v<$\tcode{T}_i$>} is \tcode{true} for all $i$.
If \tcode{is_trivially_move_constructible_v<$\tcode{T}_i$>}
is \tcode{true} for all $i$, this constructor is trivial.
\end{itemdescr}

\indexlibrary{\idxcode{variant}!constructor}%
Expand Down Expand Up @@ -4165,7 +4177,7 @@

\indexlibrarymember{operator=}{variant}%
\begin{itemdecl}
variant& operator=(const variant& rhs);
constexpr variant& operator=(const variant& rhs);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -4204,11 +4216,15 @@
\tcode{is_copy_constructible_v<$\tcode{T}_i$> \&\&}
\tcode{is_copy_assignable_v<$\tcode{T}_i$>}
is \tcode{true} for all $i$.
If \tcode{is_trivially_copy_constructible_v<$\tcode{T}_i$> \&\&}
\tcode{is_trivially_copy_assignable_v<$\tcode{T}_i$> \&\&}
\tcode{is_trivially_destructible_v<$\tcode{T}_i$>}
is true for all $i$, this assignment operator is trivial.
\end{itemdescr}

\indexlibrarymember{operator=}{variant}%
\begin{itemdecl}
variant& operator=(variant&& rhs) noexcept(@\seebelow@);
constexpr variant& operator=(variant&& rhs) noexcept(@\seebelow@);
\end{itemdecl}

\begin{itemdescr}
Expand Down Expand Up @@ -4236,8 +4252,13 @@
\pnum
\remarks
This function shall not participate in overload resolution unless
\tcode{is_move_constructible_v<$\tcode{T}_i$> \&\& is_move_assignable_v<$\tcode{T}_i$>} is
\tcode{is_move_constructible_v<$\tcode{T}_i$> \&\&}
\tcode{is_move_assignable_v<$\tcode{T}_i$>} is
\tcode{true} for all $i$.
If \tcode{is_trivially_move_constructible_v<$\tcode{T}_i$> \&\&}
\tcode{is_trivially_move_assignable_v<$\tcode{T}_i$> \&\&}
\tcode{is_trivially_destructible_v<$\tcode{T}_i$>}
is true for all $i$, this assignment operator is trivial.
The expression inside \tcode{noexcept} is equivalent to:
\tcode{is_nothrow_move_constructible_v<$\tcode{T}_i$> \&\& is_nothrow_move_assignable_v<$\tcode{T}_i$>} for all $i$.
\begin{itemize}
Expand Down