【发布时间】:2020-08-28 15:06:34
【问题描述】:
假设我执行以下操作:
void g(int* x)
{
int y = 0;
auto diff = uintptr_t(&y) - uintptr_t(x);
}
void f()
{
int x = 0;
g(&x);
}
diff 是否仅具有未定义的值,或者代码是否调用未定义的行为?根据规范,代码是否保证运行良好并计算diff 的值,可能毫无意义,或者它是否调用UB?我相信有一些关于不相关变量的东西,但无法确定它。
我对自(包括)C++ 11 以来的任何标准的答案感兴趣。
来自 cmets 的讨论:Print stack in C++
【问题讨论】:
-
@NathanOliver - 这适用于指针本身,而不适用于从它们获得的整数。
-
@JesperJuhl - 代码没有减去 指针。
-
std::ptrdiff_t 定义了一个类型
-
@QuentinUK 这在这里没用。如果不转换为
uintptr_t,由于不受单个对象/数组的限制,您的减法将具有未定义的行为。事实上,这就是使用uintptr_t的全部原因。
标签: c++ c++11 language-lawyer