草庐IT

Noexcept

全部标签

c++ - std::vector 默认构造函数可以抛出异常吗

如果我使用默认构造函数(和默认分配器)构造一个空的std::vector,它会抛出异常吗?一般来说,为容器的元素分配空间会抛出异常(即std::bad_alloc)。但是std::vector的默认构造函数并不需要分配任何这样的空间;它可以在第一次插入或赋值时懒惰地分配一些空间。但是C++标准是否要求它不抛出异常(暗示惰性分配,或者捕获std::bad_alloc然后回退到惰性分配)? 最佳答案 这取决于Allocator的默认构造函数。std::vector的默认构造函数声明为vector()noexcept(noexcept(A

c++ - 标准中override和noexcept的顺序

override和noexcept的顺序是标准要求的吗?classBase{public:virtualvoidfoo(){}};classDerived:publicBase{public://virtualvoidfoo()override{}//Ok//virtualvoidfoo()noexcept{}//Ok//virtualvoidfoo()noexceptoverride{}//Okvirtualvoidfoo()overridenoexcept{}//Error};intmain(){}我正在使用gcc4.7.2。 最佳答案

c++ - 为什么 std::vector 使用 move 构造函数,尽管声明为 noexcept(false)

无论我在互联网上的什么地方阅读,强烈建议如果我希望我的类(class)与std::vector一起工作(即std使用我类(class)的move语义::vector)我应该将构造函数delcaremove为'noexcept'(或noexcept(true))。为什么std::vector使用它,即使我将它标记为noexcept(false)作为实验?#include#includeusingstd::cout;structT{T(){coutt_vec;t_vec.push_back(T());}输出:T()T(T&&)~T()~T()为什么?我做错了什么?在gcc4.8.2上编译,

c++ - 如何使用隐式虚拟析构函数正确解决不兼容的抛出说明符?

此代码无法编译:#include/*relevantpart:structQString{~QString()noexcept(false){};};*/classBase{public:virtual~Base()=default;};classDerived:publicBase{QStringstring_;};intmain(){return0;}错误是:error:looserthrowspecifierfor'virtualDerived::~Derived()'error:overriding'virtualBase::~Base()noexcept(true)'我没有使

c++ - 在 std::function 上强制执行 "noexcept"?

此代码编译并运行,抛出int:#includevoidr(std::functionf){f();}voidfoo(){throw1;}intmain(){r(foo);}但是我希望编译器拒绝r(foo);行,因为r应该只传递一个noexcept函数。noexcept说明符似乎被忽略了。有什么办法可以实现吗?编辑:这个问题不同于Isknowledgeaboutnoexcept-nesssupposedtobeforwardedwhenpassingaroundafunctionpointer?因为我要求补救措施,特别是在std::function的情况下。

c++ - STL 容器元素是否明确要求 (noexcept) 可破坏?

C++11(和C++14)STL容器有noexcept析构函数和clear()成员函数。这意味着元素应该有noexcept析构函数,或者至少存储在容器中的实际元素在被销毁时不应该抛出任何异常——或者更准确地说,相应的allocator_traits::destroy调用不应抛出。这是否在标准的任何地方指定为要求(明确或由另一个明确要求暗示)?如果不是,为什么?我知道is_nothrow_constructible需要noexcept析构函数,但是is_constructible单独没有,并且容器要求是根据概念而不是类型特征模板指定的。 最佳答案

C++ noexcept 声明更改模板推导

我正在修补以确认EffectiveModernC++第91页上的示例,我遇到了一个似乎很奇怪的问题。这段代码templatevoiddoStuff(C&a,C&b)noexcept(noexcept(doStuff(a.front(),b.front()))){std::coutvoiddoStuff(int&x,int&y)noexcept{std::coutv1={1,2,3};vectorv2={4,5,6};intx=5;inty=6;doStuff(x,y);doStuff(v1,v2);}给我一​​个错误,比如error:requestformember‘front’in‘

c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?

为什么要为std::vectormove构造函数使用自定义分配器不会推断出noexcept()来自分配器的行为?这导致封装此类vector的类无法形成可以在某些中正常move的(其他)vector秒。即使基础类型满足必要的要求(MoveInsertable和DefaultInsertable)。 最佳答案 我假设“使用自定义分配器为std::vectormove构造函数”是指分配器扩展的move构造函数,即这个构造函数:vector(vector&&v,constallocator_type&a);主要原因是如果v.get_allo

c++ - 异常规范的评估点

考虑这些代码片段:版本(1)voidq(){}classB{voidf()noexcept(noexcept(q())){q();}decltype(&B::f)f2;};版本(2)voidq(){}classB{voidf()noexcept(true){q();}decltype(&B::f)f2;};版本(3)voidq(){}classB{voidf()noexcept{q();}decltype(&B::f)f2;};所有版本的GCC编译这些代码片段都没有任何错误或警告(包括主干版本)。所有支持C++17的Clang版本都拒绝版本(1)和(2),但不支持版本(3),并出现以下

c++ - 在模板类型推导之前评估 noexcept 说明符

请看下面的代码:#includestructA{A(int,int){}};structtag{};templatestructis_noexcept{staticconstexprboolvalue=noexcept(A{std::declval()...});};structB:A{//#1templateB(tag,Args&&...args)noexcept(/*Here*/is_noexcept::value):A{std::forward(args)...}{}//#2B(intx,inty):A{x,y}{}};intmain(){Bx{0,0};}这段代码似乎被GCC/