草庐IT

noexcept-ness

全部标签

c++ - noexcept 有什么用?

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

c++ - execv() 和 const-ness

我经常在C++中使用execv()函数,但是如果某些参数是C++字符串中的,我会因为不能这样做而烦恼:constchar*args[4];args[0]="/usr/bin/whatever";args[1]=filename.c_str();args[2]=someparameter.c_str();args[3]=0;execv(args[0],args);这不会编译,因为execv()采用与constchar*不兼容的char*constargv[],所以我必须使用strdup()将我的std::string复制到字符数组中,这很痛苦。有人知道这是什么原因吗?

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是因为它是异常说明符的一种相当有用的用法:知道函数何时不会抛出异常。因此它

c++ - 是否有自动 noexcept 说明符?

我听说noexcept关键字更像是“它永远不应该抛出异常”而不是“它不会”。如果我不确定是否抛出异常,我认为使用noexcept关键字不是很好,但是noexcept关键字有时与性能有关就像在移动构造函数中一样。所以我尝试使用noexcept限定符,但如果它在定义中有多个语句并且它变成一种复制和粘贴的东西,它会变得更加困难。templatevoidf(T&&t)noexcept(noexcept(statement_1)&&noexcept(statement_2)&&noexcept(statement_3)&&noexcept(statement_4)&&noexcept(state

c++ - 是否有自动 noexcept 说明符?

我听说noexcept关键字更像是“它永远不应该抛出异常”而不是“它不会”。如果我不确定是否抛出异常,我认为使用noexcept关键字不是很好,但是noexcept关键字有时与性能有关就像在移动构造函数中一样。所以我尝试使用noexcept限定符,但如果它在定义中有多个语句并且它变成一种复制和粘贴的东西,它会变得更加困难。templatevoidf(T&&t)noexcept(noexcept(statement_1)&&noexcept(statement_2)&&noexcept(statement_3)&&noexcept(statement_4)&&noexcept(state