首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

noexcept operator

noexcept运算符执行编译时检查,如果声明表达式不引发任何异常,则返回true。

它可以在函数模板%27中使用。除说明符声明该函数将对某些类型抛出异常,但不抛出其他类型的异常。

句法

noexcept( expression )

?

?

返回prvalue类型bool...

解释

noexcept运算符不计算表达式。

The result is false if the expression contains at least one of the following potentially evaluated constructs: call to any type of function that does not have non-throwing exception specification, unless it is a constant expression. throw expression. dynamic_cast expression when the target type is a reference type, and conversion needs a run time check typeid expression when argument type is polymorphic class type In all other cases the result is true.

(until C++17)

The result is true if the set of potential exceptions of the expression is empty, and false otherwise.

(since C++17)

  • 调用不具有非引发异常规范的任何类型的函数,除非它是常数表达式...
  • throw表达...
  • dynamic_cast表达当目标类型是引用类型时,转换需要运行时检查。
  • typeid表达当参数类型是多态类类型时

在所有其他情况下,结果是true...

%28直到C++17%29,结果是true如果潜在例外的表达式是空的,并且false否则。

%28自C++17%29

关键词

noexcept...

二次

代码语言:javascript
复制
#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
           << "Is may_throw() noexcept? " << noexcept(may_throw()) << '\n'
           << "Is no_throw() noexcept? " << noexcept(no_throw()) << '\n'
           << "Is lmay_throw() noexcept? " << noexcept(lmay_throw()) << '\n'
           << "Is lno_throw() noexcept? " << noexcept(lno_throw()) << '\n'
           << "Is ~T() 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
           << "Is T(rvalue T) noexcept? " << noexcept(T(std::declval<T>())) << '\n'
           << "Is T(lvalue T) noexcept? " << noexcept(T(t)) << '\n'
           << "Is U(rvalue U) noexcept? " << noexcept(U(std::declval<U>())) << '\n'
           << "Is U(lvalue U) noexcept? " << noexcept(U(u)) << '\n'  
           << "Is V(rvalue V) noexcept? " << noexcept(V(std::declval<V>())) << '\n'
           << "Is V(lvalue V) noexcept? " << noexcept(V(v)) << '\n';  
}

二次

产出:

二次

代码语言:javascript
复制
Is may_throw() noexcept? false
Is no_throw() noexcept? true
Is lmay_throw() noexcept? false
Is lno_throw() noexcept? true
Is ~T() noexcept? true
Is T(rvalue T) noexcept? true
Is T(lvalue T) noexcept? true
Is U(rvalue U) noexcept? false
Is U(lvalue U) noexcept? false
Is V(rvalue V) noexcept? true
Is V(lvalue V) noexcept? false

二次

另见

noexcept specifier

requires a function to not throw any exceptions (C++11)

exception specification

specifies what exceptions are thrown by a function (deprecated)

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com