|
9004 | 9004 | or with different \grammarterm{attribute-argument-clause}s)
|
9005 | 9005 | are allowed.
|
9006 | 9006 |
|
| 9007 | +\pnum |
| 9008 | +A \defnadj{nodiscard}{type} is |
| 9009 | +a (possibly cv-qualified) class or enumeration type |
| 9010 | +marked \tcode{nodiscard} in a reachable declaration. |
| 9011 | +A \defnadj{nodiscard}{call} is either |
| 9012 | +\begin{itemize} |
| 9013 | +\item |
| 9014 | + a function call expression\iref{expr.call} |
| 9015 | + that calls a function declared \tcode{nodiscard} in a reachable declaration or |
| 9016 | + whose return type is a nodiscard type, or |
| 9017 | +\item |
| 9018 | + an explicit type |
| 9019 | + conversion~(\ref{expr.static.cast}, \ref{expr.cast}, \ref{expr.type.conv}) |
| 9020 | + that constructs an object through a constructor declared \tcode{nodiscard}, or |
| 9021 | + that initializes an object of a nodiscard type. |
| 9022 | +\end{itemize} |
| 9023 | + |
9007 | 9024 | \pnum
|
9008 | 9025 | \begin{note}
|
9009 |
| -A nodiscard call is a function call expression that |
9010 |
| -calls a function previously declared \tcode{nodiscard}, or |
9011 |
| -whose return type is a possibly cv-qualified class or enumeration type |
9012 |
| -marked \tcode{nodiscard}. Appearance of a nodiscard call as |
| 9026 | +Appearance of a nodiscard call as |
9013 | 9027 | a potentially-evaluated discarded-value expression\iref{expr.prop}
|
9014 | 9028 | is discouraged unless explicitly cast to \tcode{void}.
|
9015 | 9029 | Implementations should issue a warning in such cases.
|
|
9024 | 9038 | \pnum
|
9025 | 9039 | \begin{example}
|
9026 | 9040 | \begin{codeblock}
|
| 9041 | +struct [[nodiscard]] my_scopeguard { @\commentellip@ }; |
| 9042 | +struct my_unique { |
| 9043 | + my_unique() = default; // does not acquire resource |
| 9044 | + [[nodiscard]] my_unique(int fd) { @\commentellip@ } // acquires resource |
| 9045 | + ~my_unique() noexcept { @\commentellip@ } // releases resource, if any |
| 9046 | + @\commentellip@ |
| 9047 | +}; |
9027 | 9048 | struct [[nodiscard]] error_info { @\commentellip@ };
|
9028 | 9049 | error_info enable_missile_safety_mode();
|
9029 | 9050 | void launch_missiles();
|
9030 | 9051 | void test_missiles() {
|
| 9052 | + my_scopeguard(); // warning encouraged |
| 9053 | + (void)my_scopeguard(), // warning not encouraged, cast to \tcode{void} |
| 9054 | + launch_missiles(); // comma operator, statement continues |
| 9055 | + my_unique(42); // warning encouraged |
| 9056 | + my_unique(); // warning not encouraged |
9031 | 9057 | enable_missile_safety_mode(); // warning encouraged
|
9032 | 9058 | launch_missiles();
|
9033 | 9059 | }
|
|
0 commit comments