【发布时间】:2021-01-16 10:56:10
【问题描述】:
在 Visual Studio 中,指向成员变量的指针似乎是幕后的 32 位有符号整数(即使在 64 位模式下也是如此),并且在该上下文中空指针为 -1。因此,如果我有这样的课程:
#include <iostream>
#include <cstdint>
struct Foo
{
char arr1[INT_MAX];
char arr2[INT_MAX];
char ch1;
char ch2;
};
int main()
{
auto p = &Foo::ch2;
std::cout << (p?"Not null":"null") << '\n';
}
它编译并打印“null”。那么,是我造成了某种未定义的行为,还是编译器应该拒绝此代码而这是编译器中的错误?
编辑:
看来我可以保留“2 INT_MAX 数组加 2 个字符”模式,只有在这种情况下,编译器才允许我添加任意数量的成员,并且第二个字符始终被视为空值。 See demo。如果我稍微改变了模式(比如 1 或 3 个字符而不是 2 个),它会抱怨类太大。
【问题讨论】:
-
@EdoardoRosso 为什么你认为它有垃圾价值?我认为你应该阅读Pointer to class data member “::*”
-
@EdoardoRosso 不,你错了。 struct 是一个类。
-
@EdoardoRosso 不,这不是垃圾。成员指针根本不是指针。它不需要对象存在。
-
@BillLynch 偏移量分别为 0、2147483647、4294967294、4294967295。这似乎是正确的。
-
IntelliSense 解析器正确识别问题,编译器没有。有点棘手,因为这个问题只能在后端检测到。这是 x64 代码生成器的限制,对象不能大于 2GB。除此之外,需要使用一种非常不同的方式来生成地址,由于位移溢出,LEA 不能再工作了。无法使用。使用帮助 > 发送反馈 > 报告问题
标签: c++ visual-studio language-lawyer