11得票6回答
函数调用中参数的求值顺序是什么?

我正在研究C语言中的未定义行为,发现有一条声明称: 函数参数没有特定的计算顺序 但是标准调用约定(如"_cdecl"和"_stdcall")的定义指出(书中),参数从右到左进行计算。 现在我对这两个定义感到困惑,一个根据未定义行为的规定,另一个则符合调用约定的定义。请解释这两种情...

11得票2回答
表达式的定义行为

C99标准在$6.5.2中规定: 在前一个和下一个序列点之间,一个对象的存储值最多只能被一个表达式的求值修改一次。此外,之前的值只能被读取来确定要存储的值。 (强调是我的) 它继续指出,以下示例是有效的(起初似乎很明显)a[i] = i; 虽然它没有明确说明a和i是什么。 虽然...

43得票2回答
在布尔值中设置额外位会使其同时为真和假。

如果我获得一个布尔变量并将其第二位设置为1,则变量同时评估为true和false。使用gcc6.3的-g选项编译以下代码(gcc-v6.3.0/Linux/RHEL6.0-2016-x86_64/bin/g++ -g main.cpp -o mytest_d),并运行可执行文件,你会得到以下结...

8得票1回答
函数模板特化中T=<未命名命名空间类>的静态局部变量是否需要唯一?

我们使用英特尔C++编译器,并检测到它在以下代码中进行了误编译,该代码从使用boost::function&lt;Ponies()&gt; f(unnamedNamespacedFunctor)精简而来。 a1.cc: template&lt;typename T&gt; int f(T)...

18得票1回答
在未求值的上下文中(例如需要表达式的情况下),UB是否仍然存在?

C++ 20的草案 [concept.default.init]没有精确定义default_initializable template&lt;class T&gt; concept default_initializable = constructible_from&lt;T&gt; &a...

32得票10回答
为什么vector::clear不会从向量中删除元素?

当我在std::vector上使用clear()时,它应该销毁vector中的所有元素,但实际上它并没有这样做。 示例代码:vector&lt;double&gt; temp1(4); cout &lt;&lt; temp1.size() &lt;&lt; std::endl; temp1....

12得票2回答
未指定、未定义和实现定义的行为 C语言 WIKI

尽管关于此主题的链接在SO上很丰富,但我认为缺少一份清晰易懂的解释,说明未指定行为(UsB)、未定义行为(UB)和实现定义行为(IDB)之间的区别,并详细说明任何用例和示例。 注意:我为了简洁起见,在这篇WIKI中编写了UsB首字母缩略词,但不要指望在其他地方看到它被使用。 我知道这可能看...

9得票3回答
在一个内联函数有不同的定义是否是未定义行为?

最简代码: // --------inline.h-------- struct X { static inline void foo (); }; #ifdef YES inline void X::foo () { cout &lt;&lt; "YES\n"; } #else...

98得票3回答
在C++中,带符号整数溢出仍然是未定义行为吗?

我们知道,有符号整数溢出是未定义的行为。但在 C++11 的 cstdint 文档中有一些有趣的内容: 有符号整数类型,宽度分别为 8、16、32 和 64 位,没有填充位,并且对于负值使用2的补码(仅当实现直接支持该类型时提供) 查看链接 我的问题是:由于标准明确规定对于 int8...

14得票1回答
可变原始指针(*mut T)的别名是否会导致未定义行为?

&amp;mut T和&amp;mut T会导致编译错误,这很好,借用可变两次是客观错误。 *mut T和*mut T是否未定义行为或者说这是完全有效的事情?也就是说,可变指针别名是有效的吗? 更糟糕的是,&amp;mut T和*mut T实际上可以编译并按预期工作,我可以通过引用、指针和...