gpt4 book ai didi

c++ - 为什么这段代码可以编译无误?

转载 作者:行者123 更新时间:2023-11-30 01:05:15 27 4
gpt4 key购买 nike

这里讨论了pointer to data member的用法

据我所知,指向数据成员的指针像int A::* p不保留该成员的真实地址,而是保留一个偏移量。但是,我遇到了如下奇怪的情况:

class TEST
{
int k;
};
int main()
{
double TEST::* p;//why?
}

上面的代码片段如何编译无误,因为实际上没有 TEST 类的 double 类型成员?(不需要诊断?)更重要的是,cout<<p;也可以无错误地运行,尽管它可能是未定义的行为。

最佳答案

您的示例代码:

double TEST::* p;

尽管 TEST 没有任何 double 成员,但声明指向 double 成员的指针是合法的,因为将其设为非法没有任何好处.它会在标准中添加大量标准语,但没有任何好处——如果您尝试将其设置为空指针常量以外的任何值,您已经会遇到编译器错误。

代码片段:

double TEST:* p;
std::cout << p << std::endl;

是未定义的行为(好的编译器会发出警告),原因与此相同:

int i;
std::cout << i << std::endl

未定义。在这两种情况下,变量都没有值。

关于c++ - 为什么这段代码可以编译无误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48862424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com