草庐IT

c++ - 调用函数对象时如何保证参数评估的顺序?

howtoavoidundefinedexecutionorderfortheconstructorswhenusingstd::make_tuple上问题的答案引发了一次讨论,在讨论中我了解到可以保证构造函数的参数评估顺序:使用braced-init-list可以保证从左到右的顺序:T{a,b,c}表达式a、b和c按给定顺序计算。情况就是这样,即使类型T只是定义了一个普通的构造函数。显然,并非所有被调用的东西都是构造函数,有时在调用函数时保证评估顺序会很好,但没有像brace-argument-list这样的东西来调用函数对他们的论点进行定义的评估顺序。问题变成了:对构造函数的保证是

c++ - 调用函数对象时如何保证参数评估的顺序?

howtoavoidundefinedexecutionorderfortheconstructorswhenusingstd::make_tuple上问题的答案引发了一次讨论,在讨论中我了解到可以保证构造函数的参数评估顺序:使用braced-init-list可以保证从左到右的顺序:T{a,b,c}表达式a、b和c按给定顺序计算。情况就是这样,即使类型T只是定义了一个普通的构造函数。显然,并非所有被调用的东西都是构造函数,有时在调用函数时保证评估顺序会很好,但没有像brace-argument-list这样的东西来调用函数对他们的论点进行定义的评估顺序。问题变成了:对构造函数的保证是

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - 标准 C++11 是否保证 `volatile atomic<T>` 具有两种语义( volatile + 原子)?

众所周知,std::atomic和volatile是不同的东西。有两个主要区别:两个优化可以用于std::atomica;,但不能用于volatileinta;:融合操作:a=1;a=2;可以由a=2;上的编译器替换不断传播:a=1;local=a;可以由a=1;local=1;上的编译器替换跨原子/volatile操作的普通读/写重新排序:为volatileinta;任何volatile读/写操作都不能重新排序。但是附近的普通读/写仍然可以围绕volatile读/写重新排序。为std::atomica;基于用于原子操作的内存屏障限制附近普通读/写的重新排序a.load(std::me

c++ - c++ 标准是否保证堆栈展开并出现异常?

关于堆栈展开,c++标准说:Anexceptionisconsidereduncaughtaftercompletingtheinitializationoftheexceptionobject([except.throw])untilcompletingtheactivationofahandlerfortheexception([except.handle]).Thisincludesstackunwinding.在par15.5.3的现行标准。我试图理解最新的句子(这包括堆栈展开)指的是:是否假定编译器必须负责展开堆栈?或者,是否展开堆栈取决于编译器?问题来自以下片段:#incl

c++ - c++ 标准是否保证堆栈展开并出现异常?

关于堆栈展开,c++标准说:Anexceptionisconsidereduncaughtaftercompletingtheinitializationoftheexceptionobject([except.throw])untilcompletingtheactivationofahandlerfortheexception([except.handle]).Thisincludesstackunwinding.在par15.5.3的现行标准。我试图理解最新的句子(这包括堆栈展开)指的是:是否假定编译器必须负责展开堆栈?或者,是否展开堆栈取决于编译器?问题来自以下片段:#incl

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 什么特征/概念可以保证 memsetting 一个对象是明确定义的?

假设我定义了一个zero_initialize()函数:templateTzero_initialize(){Tresult;std::memset(&result,0,sizeof(result));returnresult;}//usage:autodata=zero_initialize();为某些类型调用zero_initialize()会导致未定义的行为1,2。我目前正在强制执行T来验证std::is_pod.随着该特性在C++20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展。什么(最小)特征/概念可以保证memsetting对象的定义明确?

c++ - 我在哪里可以找到标准容器和算法的所有异常保证?

是的,我看过C++standards我可以找到(或草稿),但我没有找到任何全面的STL容器提供的异常保证。我能找到的只是偶尔出现的部分,其中对some类型的some功能的描述不完整。或者它在那里,但我只是没有找到它,我不知道。注意:我不是要一份人们能想到的所有保证的list,基本上在thisquestion.我正在寻找此信息本身的权威来源-或者最好是我可以或多或少视为官方的来源的免费版本(例如标准草案)。p> 最佳答案 阅读标准可能会令人恐惧(让我们回到标准),但BjarneStroustrup在他的《C++编程语言》一书中就这个主

c++ - 我在哪里可以找到标准容器和算法的所有异常保证?

是的,我看过C++standards我可以找到(或草稿),但我没有找到任何全面的STL容器提供的异常保证。我能找到的只是偶尔出现的部分,其中对some类型的some功能的描述不完整。或者它在那里,但我只是没有找到它,我不知道。注意:我不是要一份人们能想到的所有保证的list,基本上在thisquestion.我正在寻找此信息本身的权威来源-或者最好是我可以或多或少视为官方的来源的免费版本(例如标准草案)。p> 最佳答案 阅读标准可能会令人恐惧(让我们回到标准),但BjarneStroustrup在他的《C++编程语言》一书中就这个主