Skip to content
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
38 changes: 20 additions & 18 deletions source/utilities.tex
Original file line number Diff line number Diff line change
Expand Up @@ -18337,32 +18337,33 @@
forms the logical conjunction of its template type arguments.

\pnum
For a specialization \tcode{conjunction<B1, ..., BN>},
if there is a template type argument \tcode{Bi} for which \tcode{bool(Bi::value)} is \tcode{false},
then instantiating \tcode{conjunction<B1, ..., BN>::value}
does not require the instantiation of \tcode{Bj::value} for \tcode{j > i}.
For a specialization \tcode{conjunction<$\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$>},
if there is a template type argument $\tcode{B}_{i}$
for which \tcode{bool($\tcode{B}_{i}$::value)} is \tcode{false},
then instantiating \tcode{conjunction<$\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$>::value}
does not require the instantiation of \tcode{$\tcode{B}_{j}$::value} for $j > i$.
\begin{note} This is analogous to the short-circuiting behavior of
the built-in operator \tcode{\&\&}.
\end{note}

\pnum
Every template type argument
for which \tcode{Bi::value} is instantiated
for which \tcode{$\tcode{B}_{i}$::value} is instantiated
shall be usable as a base class and
shall have a member \tcode{value} which
is convertible to \tcode{bool},
is not hidden, and
is unambiguously available in the type.

\pnum
The specialization \tcode{conjunction<B1, ..., BN>}
The specialization \tcode{conjunction<$\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$>}
has a public and unambiguous base that is either
\begin{itemize}
\item
the first type \tcode{Bi} in the list \tcode{true_type, B1, ..., BN}
for which \tcode{bool(Bi::value)} is \tcode{false}, or
the first type $\tcode{B}_{i}$ in the list \tcode{true_type, $\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$}
for which \tcode{bool($\tcode{B}_{i}$::value)} is \tcode{false}, or
\item
if there is no such \tcode{Bi}, the last type in the list.
if there is no such $\tcode{B}_{i}$, the last type in the list.
\end{itemize}
\begin{note} This means a specialization of \tcode{conjunction}
does not necessarily inherit from
Expand All @@ -18386,30 +18387,31 @@
forms the logical disjunction of its template type arguments.

\pnum
For a specialization \tcode{disjunction<B1, ..., BN>},
if there is a template type argument \tcode{Bi} for which \tcode{bool(Bi::value)} is \tcode{true},
then instantiating \tcode{disjunction<B1, ..., BN>::value}
does not require the instantiation of \tcode{Bj::value} for \tcode{j > i}.
For a specialization \tcode{disjunction<$\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$>},
if there is a template type argument $\tcode{B}_{i}$
for which \tcode{bool($\tcode{B}_{i}$::value)} is \tcode{true},
then instantiating \tcode{disjunction<$\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$>::value}
does not require the instantiation of \tcode{$\tcode{B}_{j}$::value} for $j > i$.
\begin{note} This is analogous to the short-circuiting behavior of
the built-in operator \tcode{||}.
\end{note}

\pnum
Every template type argument
for which \tcode{Bi::value} is instantiated
for which \tcode{$\tcode{B}_{i}$::value} is instantiated
shall be usable as a base class and
shall have a member \tcode{value} which
is convertible to \tcode{bool},
is not hidden, and
is unambiguously available in the type.

\pnum
The specialization \tcode{disjunction<B1, ..., BN>}
The specialization \tcode{disjunction<$\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$>}
has a public and unambiguous base that is either
\begin{itemize}
\item the first type \tcode{Bi} in the list \tcode{false_type, B1, ..., BN}
for which \tcode{bool(Bi::value)} is \tcode{true}, or
\item if there is no such \tcode{Bi}, the last type in the list.
\item the first type $\tcode{B}_{i}$ in the list \tcode{false_type, $\tcode{B}_{1}$, $\dotsc$, $\tcode{B}_{N}$}
for which \tcode{bool($\tcode{B}_{i}$::value)} is \tcode{true}, or
\item if there is no such $\tcode{B}_{i}$, the last type in the list.
\end{itemize}
\begin{note} This means a specialization of \tcode{disjunction}
does not necessarily inherit from
Expand Down