- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在回答中
表明程序可能具有未定义的行为“取决于”(本问题中的 des Pudels Kern)实现如何使用标准给出的实现余地。例如,[expr.prim.lambda.closure]/2 :
The closure type is declared in the smallest block scope, class scope,or namespace scope that contains the corresponding lambda-expression. [...]The closure type is not an aggregate type. Animplementation may define the closure type differently from what isdescribed below provided this does not alter the observable behaviorof the program other than by changing:
- (2.1) the size and/or alignment of the closure type,
- (2.2) whether the closure type is trivially copyable ([class.prop]), or
- (2.3) whether the closure type is a standard-layout class ([class.prop]). [...]
在对答案的评论中指出,这种情况不是实现定义的行为
"implementation-defined" has a very specific meaning ([intro.abstract]/2); this isn't a case of that.
在这种实现余地条件下具有未定义行为 (UB) 的程序是否会具有无条件 UB,可能根据 [intro.abstract]/5 ?或者如何用标准术语描述这样的程序?
最佳答案
假设我正确理解了这个问题,这里有一个更简单的例子:
void* storage = ::operator new(100);
new (storage) std::string;
在某些语言实现中,当字符串适合内存时,将定义此示例程序的行为。但是该标准不保证任何语言实现都满足该假设,并且在假设不成立的语言实现中,行为是未定义的。
该行为有条件地未定义,具体取决于语言实现。这同样适用于问题中描述的更微妙的例子。
这不是“实现定义”的行为,因为标准并没有说它是使用那些引用的词的“实现定义”。如果标准确实这么说,那就意味着语言实现必须记录该行为。实际上,不需要记录闭包类型是否可简单复制。
为了避免这个短语具有特殊含义,我们可以使用诸如“依赖于实现”或“未指定”之类的替代词来描述这种情况。
如果您希望编写可移植到当前标准的任何语言实现的程序,包括您目前无法知道其实现的 future 存在的程序,您不应无条件地依赖此类实现细节。
您可以使用类型特征来观察闭包是否可平凡复制,并有条件地使用 std::bit_cast
仅当它格式正确且定义良好时 - 如果您有充分的理由这样做所以。
关于c++ - 未定义行为 (UB) 以实现余地为条件的程序是否为具有无条件 UB 的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68851113/
在回答中 Is it valid to create closure (lambda) objects using `std::bit_cast` in C++20? 表明程序可能具有未定义的行为“取
C++ 20 draft [concept.default.init] 没有精确定义 default_initializable template concept default_initializa
我担心这又是一个关于解释 ISO/IEC 14882(C++ 标准)的问题,但是: 正在从程序中调用 main,例如我从 main 递归调用 main() 至少不是实现定义的行为? (更新:我的意思是
想象一下: uint64_t x = *(uint64_t *)((unsigned char[8]){'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}); 我有 rea
考虑以下代码: int main() { typedef struct { int first; float second; } type; type whole = { 1, 2.0
这个问题已经有答案了: (Why) is using an uninitialized variable undefined behavior? (7 个回答) 已关闭 6 年前。 SO 上各种受人尊
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我最近在这样的代码中遇到了一个错误 class C { public: // foo return value depends on C's state // AND each cal
我最近在升级到 gcc 7.2 后遇到了一个奇怪的 C++ 崩溃,这可以使用以下简单的完整 c++11 程序来演示: #include #include struct MyObject {
所以,我一直在阅读 the C++ standard并来到 [defns.undefined](我正在阅读的 C++17 草案中的 3.27。请注意,虽然我在这里引用 C++17,但我在 other
这不是 Rvalue reference to lvalue reference 的拷贝 由于我是针对 C++17 提出这个问题的:由于悬空引用,以下是否仍会调用未定义的行为(当然,如果使用了引用)?
这个问题在这里已经有了答案: Arithmetic right shift gives bogus result? (2 个答案) 关闭 7 年前。 我想检查一些大的计算内存需求(存储在 unsig
坦率地说,这样的代码是否有效(除了缺乏必要的错误检查,为简单起见此处省略)? 通过互联网发送数据的代码: uint16_t i = htons(500); sendto(sockfd, &i, siz
我知道 C 和 C++ 以及不同的语言,但以下内容适用于两者。 TL/DR 我知道 i = i++; 是 UB,因为 i 在表达式中被修改了两次,而 C 和 C++ 禁止它。 引用资料: C99 6.
是否有可能满足以下条件的代码在每次运行相同输入时产生不同的输出? 虽然代码是单线程的它确实链接到一个线程安全的运行时库。 没有明确调用 rand() 或 time() 或它们的 friend 。 有一
这个问题在这里已经有了答案: is there issue will stringstream.str().c_str()? [duplicate] (3 个答案) 关闭 6 年前。 考虑以下代码,
根据 C++ 标准,如果对象本身不是 const,则可以从指针中丢弃 const 并写入对象。这样: const Type* object = new Type(); const_cast( ob
下面的代码会调用 UB 吗? int main(){ volatile int i = 0; volatile int* p = &i; int j = ++i * *p; } 最佳答案
这个问题在这里已经有了答案: will casting around sockaddr_storage and sockaddr_in break strict aliasing (2 个答案) 关
假设我们有来自 C++98 的遗留代码: bool expensiveCheck(); struct Foo; bool someFunc() { Foo *ptr = 0; if(
我是一名优秀的程序员,十分优秀!