草庐IT

c++ - 在哪里可以找到有关 C++/STL 方法异常保证的信息?

前几天我正在编写带有异常处理的代码,我有一些关于异常、它们的保证和可抛出的问题。基本上,假设您有:classX{stringm_str;X():m_str("foo")//whatifthisthrows?{ifstreamb("a.in")//whatifthisthrows?}在浏览了我能找到的所有文章之后,我仍然不知道处理这个问题的简洁方法是什么。假设我有这样的代码:{...XmyInstanceOfClassX;...}我应该将代码包装在catch(exception&)中吗?如果我这样做,string和ifstream是否能提供强有力的保证,即没有资源泄漏,也没有任何内容被半

c++ - 是否有任何 C++11 线程安全保证适用于使用 C++11 编译/链接的第三方线程库?

C++11提供了类似thread-safeinitializationofstaticvariables的特性,并引用这个问题,例如:Logger&g_logger(){staticLoggerlg;returnlg;}所以表面上(?)这是真的,不管用C++11编译器编译的模块是否包含线程header,或者在其主体中生成任何线程。即使它链接到另一个使用C++11线程并调用该函数的模块,您也可以获得保证。但是,如果调用此代码的“其他模块”不是使用C++11线程,而是使用Qt的QThread之类的东西,该怎么办。那么静态的原子初始化是否超出了C++11做出这种保证的能力范围?还是仅凭一个模

c++ - 是否保证 sizeof(T[N]) == N * sizeof(T)?

我一直假设T类型的N个元素的数组的大小,如sizeof返回的那样,保证正好是sizeof(T)。commentsonthisquestion虽然让我怀疑。有信誉的用户声称数组可能包含填充,这会破坏相等性。当然,这样的平台可能不存在,但它们被允许吗?如果允许,这将打破许多常见的习语,例如使用N*sizeof(T)计算数组所需的存储空间,或使用计算数组中的元素数量sizeof(a)/sizeof(a[0])。 最佳答案 是的。[expr.sizeof]包含关于sizeof的这一点:Whenappliedtoanarray,theresu

c++ - 在 move 构造函数中用作 arg 后,哪些 std 类型保证为空/空

我知道shared_ptr,unique_ptr,weak_ptr在相同类型的构造函数中用作RVR参数后保证为空,但是我想知道除了我提到的那些之外,标准是否为其他一些std::类型指定了这一点。请注意,我知道move后的元素处于有效但未指定状态,我在这里对指定了哪些类型状态感兴趣。 最佳答案 使移出对象处于“空”状态的类型是智能指针、锁([thread.lock.unique.cons]/21、[thread.lock.shared.cons]/21)、文件流([filebuf.cons]/(4.2))、future([future

c++ - C++ 中基类地址的保证?

在C结构中,我保证:structFoo{...};structBar{Foofoo;...}Barbar;assert(&bar==&(bar.foo));现在,在C++中,如果我有:classFoo{...};classBar:publicFoo,publicOthercrap...{...}Barbar;assert(&bar==(Foo*)(&bar));//isthisguaranteed?如果是这样,你能给我一个引用吗(比如“C++编程语言,第xyz页”)?谢谢! 最佳答案 没有保证。来自C++03标准(10/3,clas

c++ - C++17 标准是否保证 union 的地址与其成员的地址相同?

我目前正在编写一个池分配器。我的问题归结为以下代码:templateunionmyUnion{Tdata;myUnion*nextUnion;};voidsomeFunction(){myUnionmu;T*t=new(std::addressof(mu.data))T();//somecodemyUnion*mu2=reinterpret_cast*>(t);}mu的地址总是和mu2一样吗? 最佳答案 是的。9.2/19(N4659中为12.2/24):Ifastandard-layoutclassobjecthasanynon-

c++ - 许多情况下的开关优化保证任何情况下均等的访问时间? ( C++ )

我在这里看到了针对特定语言的答案,关于超过5种情况的开关使用跳转表进行了优化,以保证任何情况下的恒定访问时间。C/C++也是这样吗?它特别适用于gcc吗?用于VisualStudio?如果不是,按发生频率的顺序对案例进行排序会有帮助吗? 最佳答案 标准不保证switch语句将如何实现。我从未见过编译器生成哈希表,尽管有相当一部分会生成跳转表。除非我的内存力比平时更差,否则VS和gcc都可以在案例足够密集时生成跳转表(对于“足够”的不同值)。不幸的是,几乎不可能说(甚至不一定弄清楚)按出现频率排序何时会有帮助——不仅在编译器之间不同,

c++ - vector 指针位置保证?

假设我有一个整数vector,std::vectornumbers;填充了一堆值,然后我说这样做(条目存在于43)int*oneNumber=&numbers[43];是否保证oneNumber始终指向索引43处的int,即使我将数字调整为类似numbers.resize(46)的大小?我不是100%确定这里的预期行为是什么,我知道vector保证是连续的,但不确定这种连续性是否也意味着vector中的所有索引在其整个生命周期中都将保持在同一个位置。 最佳答案 IsoneNumberguaranteedtoalwaysbepoint

c++ - 保证复制省略在 C++1z 的列表初始化中如何工作?

在c++draftn4606[dcl.init]17.6中有一段关于guaranteecopyelision的内容:Ifthedestinationtypeisa(possiblycv-qualified)classtype:Iftheinitializerexpressionisaprvalueandthecv-unqualifiedversionofthesourcetypeisthesameclassastheclassofthedestination,theinitializerexpressionisusedtoinitializethedestinationobject.[

c++ - 实现一个保证不会移动的 "string pool"

我需要一个“字符串池”对象,我可以在其中重复插入一个“字符序列”(我用这个短语来表示“字符串”,而不会将它与std::string或C字符串混淆),获得一个指针到序列,并保证如果/当池需要增长时指针不会失效。使用简单的std::string因为池将无法工作,因为当字符串超出其初始容量时可能会重新分配字符串,从而使所有先前指向它的指针无效。池不会无限制地增长——有明确定义的点,我将在这些点上调用clear()它的方法——但我也不想在它上面保留任何最大容量。它应该能够在不移动的情况下生长。我正在考虑的一种可能性是将每个新的字符序列插入到forward_list中。并获得begin()->c