【发布时间】:2019-02-21 18:00:53
【问题描述】:
考虑以下代码:
#include <cstdint>
#include <algorithm>
std::uintptr_t minPointer(void *first, void *second) {
const auto pair = std::minmax(
reinterpret_cast<std::uintptr_t>(first),
reinterpret_cast<std::uintptr_t>(second)
);
return pair.first;
}
以及由 GCC8 生成的程序集,开启 -O3
https://godbolt.org/z/qWJuV_ 为minPointer:
minPointer(void*, void*):
mov rax, QWORD PTR [rsp-8]
ret
这显然不符合代码创建者的意图。这段代码是导致一些 UB 还是 GCC(8) 错误?
【问题讨论】:
-
AFAIK,如果指针不在同一个数组或对象中,您根本不能使用
<来比较指针;其他都是UB。 -
(见下面的 cmets,但仍然有些相关)less than comparison for void pointers
-
@underscore_d 我同意贾斯汀的观点。然而你掉的东西还是很有趣的,我不知道
-
相关:Observing weird behavior with 'auto' and std::minmax / If std::max() returns by reference (as it must), might that lead to a dangling reference? - & cppreference for
minmax注释 - 有点远 - "对于重载 (1,2),如果其中一个参数是右值,返回的引用成为包含调用的完整表达式末尾的悬空引用" -
另一个:structured bindings with std::minmax and rvalues(剧透:结构化绑定无法避免这种情况,因为如果将类型声明为值,则适用于不可见的
pair,而不是其成员)
标签: c++ language-lawyer undefined-behavior reinterpret-cast