草庐IT

Noexcept

全部标签

c++ - 为什么 basic_string::swap 不是 noexcept?

我刚刚发现basic_string的两个交换函数(成员函数和命名空间std中的函数)没有用noexcept声明——既不是在GCC-4.8的标准库中,也不是在最新的C++草案N3690。另一方面,移动构造函数和移动赋值运算符是用noexcept声明的。这说明应该可以提供noexcept交换函数。问题:没有用noexcept声明交换函数的原因是什么?更新:问题是我想在我自己的交换函数中使用一个模板函数,它使用static_assert来检查交换实际上是noexcept,例如:structfoo{bar_tbar;baz_tbaz;voidswap(foo&rhs)noexcept{swap

c++ - 理论上但不是实际上的抛出函数应该声明为 noexcept 吗?

即使v.at(idx)理论上可以抛出out_of_range异常,但声明以下函数noexcept是否安全,但实际上不是因为边界检查?intget_value_or_default(conststd::vector&v,size_tidx)noexcept{if(idx>=v.size()){return-1;}returnv.at(idx);} 最佳答案 您对“安全”的定义是什么?如果您在标记为noexcept或noexcept(true)的函数中抛出异常,那么您的程序将被终止(标准15.4.9)Wheneveranexceptio

c++ - shared_ptr 如何提供 noexcept 分配?

std::shared_ptr如何提供noexceptoperator=?当然,如果这个shared_ptr是最后一个,那么它必须销毁它的内容,并且不能保证那个对象的析构函数不会抛出,或者原来使用的自定义删除器不会扔。 最佳答案 对我来说似乎是个缺陷,虽然我在activeissueslist中找不到一个(虽然#2104类似)。根据[C++11:20.7.2.2.3/1],赋值定义为等价于shared_ptr(r).swap(*this);但根据[C++11:20.7.2.2.2],~shared_ptr本身不是noexcept。除非

c++ - noexcept 有什么用?

我看到C++11添加了noexcept关键字。但我真的不明白它为什么有用。如果函数在不应该抛出的时候抛出-我为什么要让程序崩溃?那么我应该什么时候使用它呢?另外,它如何与使用/Eha编译和使用_set_se_translator一起工作?这意味着任何代码行都可以抛出c++异常——因为它可能会抛出SEH异常(因为访问protected内存)并且它会被转换为c++异常。然后会发生什么? 最佳答案 noexcept的主要用途是用于通用算法,例如,在调整std::vector的大小时:对于移动元素的有效算法,必须提前知道没有任何移动会抛出。

c++ - 处理 gcc 的 noexcept 类型警告

考虑这个例子,来自bug80985:templatevoidcall(Funcf){f();}voidfunc()noexcept{}intmain(){call(func);}在启用所有警告的情况下编译它,就像你做的那样,产生:$g++-std=c++14-Wallfoo.cxxfoo.cxx:2:6:warning:manglednamefor‘voidcall(Func)[withFunc=void(*)()noexcept]’willchangeinC++17becausetheexceptionspecificationispartofafunctiontype[-Wnoex

c++ - 为什么容器移动赋值运算符不是 noexcept?

我注意到std::string的(实际上是std::basic_string的)移动赋值运算符是noexcept。这对我来说很有意义。但后来我注意到没有一个标准容器(例如,std::vector、std::deque、std::list、std::map)声明其移动赋值运算符noexcept。这对我来说意义不大。例如,std::vector通常实现为三个指针,并且指针当然可以移动分配而不会引发异常。然后我认为问题可能在于移动容器的分配器,但是std::string也有分配器,所以如果这是问题,我希望它会影响std::string.那么为什么std::string的移动赋值运算符是noe

c++ - 为什么 vector 访问运算符没有指定为 noexcept?

为什么没有指定std::vector的operator[]、front和back成员函数作为noexcept? 最佳答案 noexcept标准的政策是只标记不能或不得失败的函数,而不是那些简单指定不失败的函数抛出异常。换句话说,所有具有有限域的函数(传递错误的参数并且你得到未定义的行为)都不是noexcept,即使它们没有被指定为抛出。被标记的函数是swap(不能失败,因为异常安全通常依赖于此)和numeric_limits::min(不能失败,返回一个常量原始类型)。原因是实现者可能希望为其库提供特殊的调试版本,这些版本会引发各种

c++ - 如何在 Visual Studio 中处理 noexcept

我正在尝试创建一个从std::exception派生并覆盖what()的自定义异常。一开始我是这样写的:classUserException:publicstd::exception{private:conststd::stringmessage;public:UserException(conststd::string&message):message(message){}virtualconstchar*what()constoverride{returnmessage.c_str();}};这在VS2012中运行良好,但在带有-std=c++11的GCC4.8中无法编译:erro

c++ - 如何编写启用 ADL 的尾随返回类型或 noexcept 规范?

假设我正在编写一些容器模板或其他东西。是时候为它专门化std::swap了。作为一个好公民,我将通过执行以下操作来启用ADL:templatevoidswap(my_template&x,my_template&y){usingstd::swap;swap(x.something_that_is_a_T,y.something_that_is_a_T);}这非常整洁。直到我想添加一个异常规范。只要T的交换是noexcept,我的swap就是noexcept。所以,我会写这样的东西:templatevoidswap(my_template&x,my_template&y)noexcept

c++ - C++03 throw() 说明符 C++11 noexcept 之间的区别

throw()和noexcept除了分别在运行时和编译时检查外,还有什么区别吗?ThisWikipediaC++11article建议弃用C++03抛出说明符。为什么会这样,noexcept是否足以在编译时涵盖所有这些?[注意:我检查了thisquestion和thisarticle,但无法确定弃用的充分理由。] 最佳答案 不推荐使用异常说明符,因为exceptionspecifiersaregenerallyaterribleidea.添加了noexcept是因为它是异常说明符的一种相当有用的用法:知道函数何时不会抛出异常。因此它