Skip to content

Latest commit

 

History

History
153 lines (123 loc) · 5.04 KB

File metadata and controls

153 lines (123 loc) · 5.04 KB
title noexcept operator
sidebar
order
5

import { Decl, DeclDoc } from "@components/decl-doc"; import { Desc, DescList, DocLink } from '@components/index'; import { Revision, RevisionBlock } from "@components/revision"; import { DR, DRList } from "@components/defect-report"; import { ParamDoc, ParamDocList } from "@components/param-doc";

The noexcept operator performs a compile-time check that returns true if an expression is declared to not throw any exceptions.

It can be used within a function template's noexcept specifier to declare that the function will throw exceptions for some types but not others.

Syntax

```cpp cxx-mark noexcept(/*$s:expression*/) ```

Returns a prvalue of type bool. The result is true if the set of of the expression is emptyexpression is specified to be non-throwing, and false otherwise.

expression is an unevaluated operand.

If expression is a prvalue, temporary materialization is applied.

Notes

Even if noexcept(expr) is true, an evaluation of expr may still throw as the result of encountering undefined behavior.

If _expression_ is of a class type or (possibly multidimensional) array thereof, temporary materialization requires the destructor be non-deleted and accessible.

Keywords

  • noexcept

Example

#include <iostream>
#include <utility>
#include <vector>

void may_throw();
void no_throw() noexcept;
auto lmay_throw = []{};
auto lno_throw = []() noexcept {};

class T
{
public:
    ~T(){} // dtor prevents move ctor
           // copy ctor is noexcept
};

class U
{
public:
    ~U(){} // dtor prevents move ctor
           // copy ctor is noexcept(false)
    std::vector<int> v;
};

class V
{
public:
    std::vector<int> v;
};

int main()
{
    T t;
    U u;
    V v;

    std::cout << std::boolalpha <<
        "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n"
        "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n"
        "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n"
        "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n"
        "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n"
        // note: the following tests also require that ~T() is noexcept because
        // the expression within noexcept constructs and destroys a temporary
        "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n"
        "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n"
        "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n"
        "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n"
        "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n"
        "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n";
}

Output:

may_throw() is noexcept(false)
no_throw() is noexcept(true)
lmay_throw() is noexcept(false)
lno_throw() is noexcept(true)
~T() is noexcept(true)
T(rvalue T) is noexcept(true)
T(lvalue T) is noexcept(true)
U(rvalue U) is noexcept(false)
U(lvalue U) is noexcept(false)
V(rvalue V) is noexcept(true)
V(lvalue V) is noexcept(false)

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

it was unclear whether temporary materialization is applied if _expression_ is a prvalue it is applied in this case the `noexcept` operator was required to determine whether exceptions may be thrown in the case of encountering undefined behavior not required

See also

noexcept specifier
specifies whether a function could throw exceptions
Dynamic exception specification
<Revision traits={[{ trait: "deprecated", since: "C++26" }]}>specifies what exceptions are thrown by a function</Revision>