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

将deleted函数声明为noexcept有什么意义吗?

将deleted函数声明为noexcept的意义在于明确告诉编译器,该函数不会抛出任何异常。这样做有以下几个好处:

  1. 代码可读性:通过将deleted函数声明为noexcept,可以清晰地表达该函数不会抛出异常,提高代码的可读性和可维护性。
  2. 优化机会:编译器在知道函数不会抛出异常的情况下,可以进行一些优化,提高代码的执行效率。
  3. 异常安全性:在C++中,异常安全性是一个重要的概念。如果一个函数在执行过程中抛出异常,而没有被捕获和处理,可能会导致资源泄漏或者程序崩溃。将deleted函数声明为noexcept可以避免这种情况的发生。
  4. 接口规范:在某些情况下,deleted函数可能会被其他函数调用,如果deleted函数声明为noexcept,可以作为接口规范的一部分,确保调用者在使用该函数时不会出现异常。

需要注意的是,将deleted函数声明为noexcept并不意味着该函数不会引发编译错误或运行时错误。deleted函数是一种特殊的函数,用于禁止某些操作,比如禁止拷贝构造函数和赋值运算符。将其声明为noexcept只是为了告诉编译器该函数不会抛出异常,而不是改变其行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 《Effective Modern C++》读书笔记

    A&) = delete; }; 想比c++98的做法(把函数明为private,并不定义实现): class A { private: A(const A& ); A& operator...=(const A&); }; 用 = delete会更好,因为被声明 = delete的函数,编译器保证什么代码都不能调用它们(会编译报错),如果是c++98,可能是链接时才报错。...在c++11中,非成员函数的begin和end,但没有非成员函数的cbegin和cend(c++14才有)。...=) 在c++98中,允许声明一个函数会抛出什么样的异常,客户端可以根据异常声明去安排自己的代码。然并卵,因为这产生了耦合性:如果一个函数的异常声明被改动了,客户端代码也得跟着改了。...noexcept在标准库里部很重要的应用,具体请阅读原书。 noexcept还是支持表达式计算的。

    1.8K20

    一文入魂:妈妈再也不用担心我不懂C++移动语义了!

    本文将为您拨开云雾,让您对移动语义个全面而深入的理解,希望本文对你理解移动语义提供一点经验和指导。 一、为什么要有移动语义 (一)从拷贝说起 我们知道,C++中有拷贝构造函数和拷贝赋值运算符。...(一)deleted functions 在细说移动构造函数和移动赋值运算符的生成规则之前,我们先要说一说“已删除的函数(deleted functions)”。...deleted。...本节我们就来聊聊何为noexcept。 (一)为什么需要noexcept 为了说明为什么需要noexcept,我们还是从一个例子出发。...目前负责游戏工具链平台生态开发工作,丰富的游戏前端开发经验。  推荐阅读 图解史上最晦涩的分布式共识算法——Paxos! 你真的了解MD5? 超实用教程!

    1.1K20

    C++11新关键字

    C++11这些类型推导手段进行了细致的考量,最终标准化为auto与decltype。decltype与auto关键字类似,用于编译时类型推导,不过它与auto还是一些区别的。...5.3 constexpr与const的区别 const可以修饰函数参数、函数返回值、函数本身、类等,在不同的使用场景下,const具有不同的意义,不过大多数情况下,const描述的是“运行时常量性”,...template void func5() noexcept(noexcept(T())) {} 第二个noexcept是一个操作符,如果其参数是一个可能抛出异常的表达式,noexcept...这个头文件中有好几种类模板,helper class,用来产生编译时常量,type traits class,用来在编译时获取类型信息,还有就是type transformation class,他们可以已存在的类型变换为新的类型...12.thread_local thread_local由C++11引入,用于全局或static变量申明为线程局部存储(TLS,thread local storage)变量,即拥有线程生命周期及线程可见性的变量

    3.1K10

    Chapter 3: Moving to Modern C++

    ::initializer_lists和构造函数重载解析的同时出现时容易造成错误调用 在调用构造函数的时候,只要不涉及到std::initializer_list参数,括号和花括号初始化相同的含义...Prefer deleted functions to private undefined ones 删除的函数和声明为private的函数之间的区别 删除的函数在任何地方都不能使用,所以成员函数和友元函数都不能使用已经删除的函数...private,编译器给出的是权限不足警告而不是函数不可用警告 任何函数都可以是deleted状态,而只有成员函数可以是private,例如删除某些过时的重载函数 bool isLucky(int number...Understand special member function generation 特殊成员函数是C++会自动生成的函数,C++98中四个这样的函数:默认构造函数,析构函数,拷贝构造函数,拷贝赋值运算符...,反之依然,理由是:比如声明了拷贝运算,就说明移动操作不适合用于此类 三条规则:如果声明了拷贝构造,拷贝赋值或者析构函数中任何一个,都应该三个一起声明,因为这三个函数是相互关联的 三条规则暗示了析构函数的出现使得简单的

    1.8K60

    C++的noexcept

    在C++中,noexcept是一个异常说明符,用于告知编译器一个函数是否会抛出异常。使用noexcept可以提供编译器有关函数异常处理的信息,从而优化代码。...noexcept两种形式:noexceptnoexcept(expression)。 noexcept:表示函数不会抛出异常。...void func() noexcept { // 函数体 } 在这个例子中,函数func被声明为noexcept,意味着函数内部不会抛出任何异常。...使用noexcept可以带来一些优势: 优化代码:编译器可以基于函数是否标记为noexcept来进行某些性能优化,例如优化函数调用、避免不必要的栈展开等。...需要注意的是,如果在调用noexcept函数的过程中发生了异常,并且该函数没有处理异常,触发std::terminate,导致程序终止。

    25320

    如何设计一个C++的类?

    什么时候用public呢?一般情况下只会对某些静态常量我会考虑使用public修饰,前提是外部访问此常量的需求。...这个很明确,如果类会作为基类被派生时,该基类的析构函数就一定要声明为函数,如果某个类确定不会被派生,那就不要声明其析构函数为虚函数。 类需要提供拷贝构造函数?...tips:const对象上只能调用const成员函数,非const对象上既可以调用非const成员函数,也可以调用const成员函数什么时候需要加noexcept?...如果确认某个函数不会抛出异常,那就标记为noexcept,这样编译器可以对函数做进一步优化(具体做了什么优化,我也不知道),提供程序运行效率,总之,尽量把能标记为noexcept的都标记为noexcept...这里抛砖引玉下,如果是服务端编程,建议使用异常处理替代错误码的错误处理方式,关于异常处理两个常见问题: 构造函数可以使用异常 析构函数可以使用异常

    1.5K20

    《Effective Modren C++》 进阶学习(上)

    理解特殊成员函数的生成 引言   作为一名追求的程序猿,一定是希望自己写出的是最完美的、无可挑剔的代码。那完美的标准是什么,我想不同的设计师都会有自己的一套标准。...优先考虑使用deleted函数而非使用未定义的私有声明 在阻止类的某些特定成员函数被外部调用时,两种常见的方法:使用 private 访问修饰符将其声明为私有,或者使用 delete 关键字将其声明为已删除...如果函数不抛出异常请使用noexcept noexcept是一个函数修饰符,用于指示函数不会抛出异常。使用noexcept修饰的函数被称为不抛异常的函数。...使用noexcept以下几个原因: 性能优化:当一个函数被标记为noexcept时,编译器可以进行一些优化,因为它知道函数不会抛出异常。这样可以提高程序的性能。...「总结」 假如函数被声明为const,就应该被设计为线程安全的接口。

    17920

    C++11 为自定义容器实现标准的forward迭代器

    下面以此为例来简要说明为自定义的容器实现标准的迭代器的办法。...itor), FCUtils::compare(node->code, code)); 还可以利用C++11的新特性:基于范围的for循环( the range-base for statement)代码更加简化...,主要是定义了迭代器特性(std::iterator_traits),为你的自定义迭代器定义了标准迭代器所需要的的5种数据类型,这里涉及到C++的元模板编程,不在本话题的范围,就不深入说了,兴趣可以找找关于这方面的资料来看...=iter2判断两个迭代器是否不相等TYPE()创建迭代器(default 构造函数)*TYPE(iter)复制迭代器(copy 构造函数)*iter1=iter2对迭代器赋值(assign)* 但在上面的代码中实现中表中打...*号的操作都没有实现,代码也能正常编译,具体为什么有时间再研究。

    48920

    一次诡异的内存泄漏

    a = std::make_shared(); auto b = std::make_shared(); a->b_ptr = b; b->a_ptr = a; 就问了下,通常的用法是A...或者B中间的某一个变量声明为std::weak_ptr,如果两者都声明为std::weak_ptr会有什么问题?...因为传入的指针为nullptr,因此调用了_Sp_counted_ptr的特化版本,因此_M_dispose()这个函数什么都没做。...总结 下面解释下我当时阅读这块代码最难理解的部分,下面是make_shared执行过程: •_Sp_counted_base两个成员变量,分别为_M_use_count用于表示强引用计数和_M_weak_count...用于表示弱引用计数•__shared_count继承于_Sp_counted_base,其内部一个变量_M_ptr指向对象指针•__shared_ptr中存在成员变量__shared_count•使用

    22310

    C++(STL):06---数值的极值(numeric_limits类)

    climits>或中,浮点常量定义于或中 C++标准库定义一个template numeric_limits来提供这些常值 使用numeric_limits优点...{ return -2147483648; } static constexpr int max() noexcept { return 2147483647 ; } static constexpr...long double 当然你也可以为自己定义的数值类型定义一份特例化 四、numeric_limits提供的操作 numeric_limits定义在头文件中,下图列出了所有成员及其意义...C++11前并不提供lowest()和max_digits10,且所有成员函数不提供noexcept 所有成员都是constexpr的 从C++11起,所有成员都被声明为constexpr的 例如你可以在需要编译期表达式的地方使用...::max();float a[std::numeric_limits::max()]; round_style、has_denorm round_style的值如下图所示: 舍/入风格意义

    1K20

    深入理解C++11(一)

    一般情况下,断言就是一个返回值总是需要为真的判别式放在语句中,用于排除在设计的逻辑上不应该产生的情况。在某种意义上,断言并不是正常程序所必需的。...在异常处理的代码中,开发GG可能看到过如下的异常声明表达形式: void excpt_func() throw(int ,double){……} 在excpt_func()函数声明之后,定义了一个动态异常声明...C++11的新标准中,使用noexcept替换了上述特性。在C++11中,如果noexcept修饰的函数抛出了异常,编译器可以选择直接调用std::terminate()函数终止程序的运行。...一般情况下,noexcept修饰符两种形式:(1)void excpt_func() noexcept; (2)void excpt_func() noexcept(常量表达式);第二种形式中的常量表达式的结果会被转换成一个...template void fun() noexcept(noexcept(T())){} 这里,fun函数是否是一个noexcept函数,将由T()表达式是否抛出异常所决定。

    1.2K90

    c++11-17 模板核心知识(十三)—— 名称查找与ADL

    C++是一个context-sensitive的语言 : 必须知道上下文才能知道表达式的意义。那么这个和模板的关系是什么呢?...是一个已知类型的别名(using T = int),那么就不是dependent name. 101244818-7a5a3200-3743-11eb-8f54-129ea8f73ea1.png 名称查找 名称查找很多细节...ADL会将函数表达式中实参的associated namespaces和associated classes加入到查找范围,这也就是为什么叫Argument-Dependent Lookup....理解为什么需要ADL、什么时候应用到ADL时,按照对应的场景再去查就行~ 额外需要注意的一点是,ADL会忽略using : #include namespace X { template...ADL的缺点 依赖ADL可能会导致语义问题,这也是为什么有的时候需要在函数前面加::,或者一般推荐使用xxx::func,而不是using namespace xxx 。

    66130

    C++编程经验(12):C++11新特性

    当然不是说用NULL什么问题,不过新的规范都出来了,就用新规也没什么不好嘛。...既然是一个数据类型,就可以被塞到容器里面: unordered_map _msgHanderMap; 函数指针什么用,它就有什么用,可以用来推迟函数的声明。...参数绑定到函数指针上的。 以前的绑定器只能绑定一个参数,所以我们看到的很多古老的需要函数指针做传参的函数都只有一个参数传递,但是了新的绑定器就不一样了。...,int j) { // cout << i << endl; // } // //}; // // //int main() { // A a('a', 20); //} //依旧发生了转换,什么区别...; Move 构造函数 thread(thread&& x) noexcept; Move 赋值操作 thread& operator=(thread&& rhs) noexcept;

    1K20

    智能指针究竟在考什么|Effective Modern C++

    可以看出,在没有move拷贝之前, c++ 通过修改拷贝构造函数, 参数非const 达到这样结果。...remove_reference::type&&; return static_cast(t); } dynamic_cast运算符的主要用途: 基类的指针或引用安全地转换成派生类的指针或引用..., (1) 必须是类的指针或者引用 ,int类型不行 (3) base类必须有虚函数 int main() { for( int n = 0; n < 10; ++n ) {...右值是无法获取地址?如果可以 和左值什么区别【作业】 总结 个人理解:智能指针重点 不是引用计数,引用计数需要额外空间存储。 应该背后值语义,就是如何拷贝一个对象。...其实默认拷贝构造函数也能实 a(A&) 这里没cost。 但是为了和普通区分 引入move拷贝概念。 就像一个从一个房间走人到另外一个房间。 人是唯一的。

    58030
    领券