草庐IT

Noexcept

全部标签

c++ - 在 C++17 中使用 noexcept 的 std::function

在C++17中noexcepthasbeenaddedtothetypesystem:voidr1(void(*f)()noexcept){f();}voidfoo(){throw1;}intmain(){r1(foo);}最新版本的C++17模式的GCC和Clang拒绝调用r1(foo),因为void(*)()不能隐式转换为void(*)()noexcept.但是对于std::function而是:#includevoidr2(std::functionf){f();}voidfoo(){throw1;}intmain(){r2(foo);}Clang接受程序,显然忽略了noexce

c++ - 在 C++17 中使用 noexcept 的 std::function

在C++17中noexcepthasbeenaddedtothetypesystem:voidr1(void(*f)()noexcept){f();}voidfoo(){throw1;}intmain(){r1(foo);}最新版本的C++17模式的GCC和Clang拒绝调用r1(foo),因为void(*)()不能隐式转换为void(*)()noexcept.但是对于std::function而是:#includevoidr2(std::functionf){f();}voidfoo(){throw1;}intmain(){r2(foo);}Clang接受程序,显然忽略了noexce

c++ - C++ 标准是否要求 C 链接函数为 `noexcept` ?

我在标准中找不到任何强制使用extern"C"声明的函数为noexcept的内容,无论是隐式还是显式。然而,应该清楚的是,C调用约定不能支持异常......或者是吗?标准是否在我错过的地方提到了这一点?如果不是,为什么不呢?它只是作为某种实现细节留下来吗? 最佳答案 据我所知,不能保证使用“C”链接定义的函数不会引发异常。该标准允许C++程序调用具有“C”语言链接的外部函数,并定义用C++编写的具有“C”语言链接的函数。因此,没有什么可以阻止C++程序调用具有“C”语言链接的函数,该函数实际上是用C++编写的(可能在另一个编译单元中

c++ - C++ 标准是否要求 C 链接函数为 `noexcept` ?

我在标准中找不到任何强制使用extern"C"声明的函数为noexcept的内容,无论是隐式还是显式。然而,应该清楚的是,C调用约定不能支持异常......或者是吗?标准是否在我错过的地方提到了这一点?如果不是,为什么不呢?它只是作为某种实现细节留下来吗? 最佳答案 据我所知,不能保证使用“C”链接定义的函数不会引发异常。该标准允许C++程序调用具有“C”语言链接的外部函数,并定义用C++编写的具有“C”语言链接的函数。因此,没有什么可以阻止C++程序调用具有“C”语言链接的函数,该函数实际上是用C++编写的(可能在另一个编译单元中

c++ - 违反 noexcept 保证的编译器警告或静态分析?

这个问题在这里已经有了答案:Staticanalysisofnoexcept"violations"inC++(2个答案)关闭4年前。我大量使用noexcept,不幸的是,如果某些传递依赖最终导致极少数情况(我们不知道),崩溃将非常难以调试-因为noexcept会导致std::terminate被调用。有什么方法可以在编译时检测到这些违规行为吗?在下面的例子中问题很明显,但默认情况下没有编译器捕获它。我意识到这在所有情况下都是不可能的,但肯定应该可以实现更简单的情况#includevoidbaz(){throwstd::runtime_error("std::terminateawai

c++ - std::is_nothrow_move_constructible 是否需要 noexcept 析构函数?

以下代码无法使用VisualStudio2017(15.5)、gcc6.4.0和clang4.0.1进行编译,即静态断言失败:structType{Type(Type&&)noexcept{}~Type()noexcept(false){}};static_assert(std::is_nothrow_move_constructible::value,"Typeshouldbenothrow-move-constructible");static_assert(std::is_nothrow_constructible::value,"Typeshouldbenothrow-cons

c++ - 默认情况下是否继承构造函数 noexcept(true)?

Here我发现:Inheritingconstructors [...]areall noexcept(true) bydefault,unlesstheyarerequiredtocallafunctionthatis noexcept(false),inwhichcasethesefunctionsare noexcept(false).这是否意味着在下面的示例中继承的构造函数是noexcept(true),即使它已在基类中显式定义为noexcept(false),或者它本身被认为是一个不被调用的函数?structBase{Base()noexcept(false){}};stru

c++ - 复制省略返回值和 noexcept

我有一个这样的函数模板:templateconstexprautomyfunc()noexcept{returnT{};}这个函数模板是否因为复制省略而保证是noexcept?如果在构造函数内部抛出异常,这是发生在函数内部还是外部? 最佳答案 复制省略所做的就是消除实际的复制或移动。一切都发生“好像”事情发生而没有发生复制省略(当然除了复制本身)。构造发生在函数内部。复制省略不会改变这一点。它所做的只是消除实际复制/移动的发生(我在重复自己吗?)作为函数的返回值被推回其调用者的结果。因此,如果类的default构造函数抛出异常,no

c++ - 为什么 g++ 在启用 `-fpic` 的情况下不发出与构造函数相关的 noexcept 警告?

我有下一个代码:#include#includevoidg(){throw1;}void(*p)()=g;templatevoidf(T)noexcept(noexcept(T()))//warning1{p();}structA{A(){}};//warning2intmain(){try{f(A());}catch(int){}return1;}还有下一个选项:-fno-pic-fmessage-length=0-std=c++0x-Wnoexceptg++抛出下一个警告:noexcept03.C:16:6:warning:noexcept-expressionevaluatest

c++ - MSVC 2017 中 STL 容器的移动构造函数未标记为 noexcept

我正在将我的项目从VS2015迁移到VS2017,这当然不会很顺利。我看到奇怪的编译器错误,可以通过以下代码重现:structMoveOnly{MoveOnly(){}MoveOnly(constMoveOnly&)=delete;MoveOnly&operator=(constMoveOnly&)=delete;MoveOnly(MoveOnly&&)=default;MoveOnly&operator=(MoveOnly&&)=default;booloperator==(constMoveOnly&rhs)const{returnfalse;}};structHasher{siz