C++17使noexcept成为函数类型的一部分。它还允许从noexcept函数指针到潜在的抛出函数指针的隐式转换。void(*ptr_to_noexcept)()noexcept=nullptr;void(*ptr_to_throwing)()=ptr_to_noexcept;//implicitconversionhttp://eel.is/c++draft/expr.static.cast#7表示static_cast可以执行这种转换的逆操作。void(*noexcept_again)()noexcept=static_cast(ptr_to_throwing);不幸的是,GCC
我不确定这是GCC编译器的错误还是noexcept的预期行为。考虑以下示例:structB{B(int)noexcept{}virtualvoidf()=0;};structD:publicB{usingB::B;D()noexcept(noexcept(D{42})):B{42}{}voidf()override{}};intmain(){B*b=newD{};}如果noexcept被移除,它会编译。无论如何,就像在示例中一样,我从GCCv5.3.1中得到了这个错误:test.cpp:8:31:error:invaliduseofincompletetype‘structD’D()n
所以,我的问题很简单:将默认的类构造函数指定为noexcept有什么意义吗?或constexpr(或任何其他你可以考虑的事情)?structfoo{foo()=default;//vsconstexprfoo()noexcept=default;//samethingwouldapplyforcopy/movectorsandassignmentoperators};两者的行为方式是否相同?是否取决于类是否为POD?例如,对于上面的示例,两者的行为方式相同,而如果我有一个私有(private)成员std::vectorv={1,2,3,4};使用类作业,foo()=default;默认
在工作中出现了关于使用noexcept有多少关心的争论。我们都知道noexcept并没有真正为编译器的优化器做很多事情,除了编译器必须假设的外部定义的代码可能会抛出,因为它不知道它的实现,所以标记事物的唯一真正的其他性能优势noexcept用于使用std::move_if_noexcept的代码假设主要是STL容器及其算法。因此评估是这样的:不使用noexcept,除非:编译器不知道可调用的实现的外部函数和类。移动构造函数、移动赋值运算符并交换任何可能包含在STL容器中的类型。否则别担心。这是一个公平的评估吗?如果某些东西不是异常(exception),STL中是否还有其他地方可以生成
例如,有两种不同的方法来访问私有(private)数组的元素是很常见的,重载数组下标运算符,或定义at:T&operator[](size_ti){returnv[i];}Tconst&operator[](size_ti)const{returnv[i];}T&at(size_ti){if(i>=length)throwout_of_range("Youshallnotpass!");returnv[i];}Tconst&at(size_ti)const{if(i>=length)throwout_of_range("Youshallnotpass!");returnv[i];}at
似乎在至少某些编译器(GCC5.2和VisualC++2015Update1)的现代版本中,当存在已初始化的类成员时,会错误地生成noexcept默认构造函数:#include#include#includestructE{};structA{A(){throwE();}};structB{Aa;};structC{std::shared_ptrb{std::make_shared()};//C(){}//uncommenttofix};intmain(){try{newC;}catch(constE&){std::cout运行此代码会导致在GCC5.2(C++14模式)和Visual
此代码使用gcc4.8.2(-std=c++11)编译失败,但使用clang3.4(trunk)(-std=c++11)编译:#include#includestructX{X&operator=(X&&)noexcept=default;//addingnoexceptthisleadstoanerroringcc,butworksinclang://function‘X&X::operator=(X&&)’defaultedonitsfirst//declarationwithanexception-specificationthatdiffersfromthe//implicit
简单的问题:如果改变这个:voidsomeMethod();到voidsomeMethod()noexcept;它会破坏二进制兼容性,还是方法签名保持不变? 最佳答案 方法签名是否保持不变?是的。https://en.cppreference.com/w/cpp/language/noexcept_spec:Functionsdifferingonlyintheirexceptionspecificationcannotbeoverloaded(justlikethereturntype,exceptionspecification
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭6年前。Improvethisquestion在浏览C++0x工作草案的最后一次编辑时,我发现了很多删除关键字noexcept在同一位置添加文本抛出:什么都没有反之亦然。只是一些例子:替换noexcept针对抛出:无:20.6.4指针安全[util.dynamic.safety]templateT*undeclare_reachable(T*p);添加noexcept:20.6.3.2。指针特征成员函数[pointer.traits.
我正在尝试编写异常安全代码。我发现使用C++11的noexcept说明符使这个目标更容易实现。当然,一般的想法是,当且仅当它调用的所有函数也都标记为“noexcept”时,一个函数才应该标记为“noexcept”。问题在于,在大型代码库中,来自不同人的补丁经常合并在一起,很难确保保持这种一致性。所以我希望能够运行静态分析,该分析可以列出标记为“nothrow”的函数调用未标记为“nothrow”的函数的所有位置。据我在手册页中看到的,GCC无法帮助我。有没有可以帮助我的独立工具?或者其他一些编译器? 最佳答案 如果您通过使用程序的A