草庐IT

noexcept-ness

全部标签

c++ - 在可见性有限的 `std::terminate` 函数中调用 `noexcept` - gcc vs clang codegen

考虑以下代码片段:voidf();voida(){f();}voidb()noexcept{f();}在上面的场景中,f的主体对于当前翻译单元中的编译器是不可见的。因此,由于b被标记为noexcept,必须在调用方生成额外的代码以确保异常被捕获并且std::terminate被调用。这就是clang++-Ofast-std=c++2a所做的(主干版本):a():#@a()jmpf()#TAILCALLb():#@b()pushraxcallf()popraxretmovrdi,raxcall__clang_call_terminate__clang_call_terminate:#@_

c++ - 为什么 noexcept 构造函数需要实例化析构函数?

在下面的代码中,一个wrapper声明的对象包含movable,其中T是一个不完整的类型。movable的析构函数使得它不能在没有完全了解T的情况下被实例化。,但是wrapper的析构函数只是前向声明的,这意味着如果~movable()就足够了在~wrapper()的定义点实例化.#includetemplatestructmovable{movable()noexcept=default;~movable()noexcept{(void)sizeof(T);}movable(constmovable&)noexcept=delete;movable(movable&&)noexcep

c++ - noexcept 究竟包含什么构造函数?

根据C++标准,类构造函数上的noexceptnoexcept-specification究竟适用于什么?函数体?在可选的ctor-initializer中初始化成员?在可选的mem-initializer中初始化基类?在可选的mem-initializer中初始化类成员?复合语句?函数尝试block?未在ctor-initializer中初始化对象基类的初始化?未在ctor-initializer中初始化对象类成员的初始化?还有什么吗?换句话说,noexceptnoexcept-specification包含以上哪些内容(即触发std::terminate()时如果noexcept(

c++ - 将已删除的函数声明为 noexcept 有什么意义吗?

考虑一个类的这两个可能的定义:图表A:structA{A()=delete;};图表A′:structA{A()noexcept=delete;}将已删除的函数声明为noexcept有什么意义吗? 最佳答案 (最初作为评论发布,但鼓励作为答案发布。)简单地说,不。不能调用被删除的函数(或者,在构造函数的情况下,用于初始化对象)更不用说抛出异常了。编辑:hvd在下面的评论中提到noexcept(f())不会调用f()。如果类A的构造函数是deleted,那么noexcept(A())将编译失败,无论是否声明构造函数没有异常(excep

c++ - 在调用 C 函数的其他不抛出内联函数上添加 noexcept?

我已经为一些C库实现了C++绑定(bind)。库API调用可以失败,但显然不能抛出任何东西;出于这个问题的目的,我的绑定(bind)都是内联的。现在,对于我的大多数内联函数/方法,编译器可以确定不能抛出异常;例如,假设我有:boolfoo(){autoresult=wrapped_lib_foo();returnsome_constexpr_nothrow_cond(result);}我应该用noexcept标记这样的函数/方法吗?注意事项:不是ShouldIusenoexceptforsimplefunctionsthatobviouslycannotthrow?的骗子,因为在那种情

c++ - 如何为 noexcept 函数指针创建别名?

我想这样做:usingfunction_type=void(*)(void*)noexcept;但是我得到一个错误“类型别名中不允许异常规范”。(Xcode6.1版本中的clang)是否有解决方法来创建带有noexcept说明符的别名?我正在寻找能够按照跨平台功能的语言(而非扩展)定义的东西。 最佳答案 该标准明确禁止异常规范出现在typedef或别名声明中。但它也指出异常说明符可能出现在函数指针类型中。§15.4/2[except.spec]Anexception-specificationshallappearonlyonafu

c++ - 为什么 std::to_string 没有短重载?为什么没有 noexcept?

有人知道为什么C++11标准第21.5节中声明的各种to_string函数缺少short和unsignedshort的重载吗?为什么不声明这些函数noexcept呢?这是完整的重载集:stringto_string(intval);stringto_string(unsignedval);stringto_string(longval);stringto_string(unsignedlongval);stringto_string(longlongval);stringto_string(unsignedlonglongval);stringto_string(floatval);s

c++ - 如何检测模板参数是否为 noexcept 函数?

我有生成lambda的函数,它充当我稍后可以调用的函数的包装器:templateautomake_lambda(F&&f,FArgs&&...f_args){return[&]()->std::result_of_t{returnstd::forward(f)(std::forward(f_args)...);};}当参数f为noexcept时,我想使返回的lambdanoexcept成为noexcept,因此我的函数返回如下所示:return[&]()noexcept(is_noexcept::value)->std::result_of_t{returnstd::forward(f

c++ - 我怎么说 "noexcept if execution of protected base constructor is noexcept"?

我们遇到过这种情况,想知道解决它的最佳方法templatestructA:T{A(T&&t)noexcept(noexcept(T(std::move(t)))):T(std::move(t)){}};不幸的是编译失败,因为T的移动构造函数是protected,我们只能在*this的构造函数初始化列表中调用它。使这项工作有什么变通办法,或者甚至有标准的方法吗? 最佳答案 您正在寻找noexcept(std::is_nothrow_move_constructible::value):http://en.cppreference.co

c++ - 我应该声明我的异常的复制构造函数 noexcept 吗?

在更有效的C++中,ScottMeyers说C++specifiesthatanobjectthrownasanexceptioniscopied.然后我想,如果复制构造函数依次抛出异常,std::terminate就会被调用,所以这是声明我所有异常的复制构造函数noexcept的一个很好的理由(而且,我想,不要抛出从堆中分配内存的对象,例如std::string)。然而我很惊讶地看到GCC4.7.1附带的标准库实现没有为std::bad_alloc和std::exception定义那些复制构造函数>。他们不应该定义它们noexcept吗? 最佳答案