正在打印指向定义的 int 的成员指针
Is printing of a member pointer to an int defined
假设我有这个代码:
#include <iostream>
struct Mine
{
int a;
int b;
};
int main()
{
int Mine::* memberPointerA = &Mine::a;
int Mine::* memberPointerB = &Mine::b;
std::cout << memberPointerA;
std::cout << "\n";
std::cout << memberPointerB;
}
当我 运行 使用 Microsoft Visual C++ (2015)
我得到以下输出
1
1
我期望的输出更像这样:
1
2
所以这引出了一个问题:这是成员指针定义行为的打印吗?
存在从指针到 bool
的已定义转换。由于成员变量指针不是NULL
,它们的计算结果为真并打印为1
.
手头的关键问题是指向成员的指针不能转换为 void*
,这是通常处理打印指针的重载所采用的方法。
因此,使用下一个最佳转换,即转换指针->bool
。两个指针都不是空指针,因此你得到了你看到的输出。
如果您尝试打印 "normal" 指针(而不是指向成员的指针),您会得到一些与您最初预期的一致的输出。
假设我有这个代码:
#include <iostream>
struct Mine
{
int a;
int b;
};
int main()
{
int Mine::* memberPointerA = &Mine::a;
int Mine::* memberPointerB = &Mine::b;
std::cout << memberPointerA;
std::cout << "\n";
std::cout << memberPointerB;
}
当我 运行 使用 Microsoft Visual C++ (2015)
我得到以下输出
1
1
我期望的输出更像这样:
1
2
所以这引出了一个问题:这是成员指针定义行为的打印吗?
存在从指针到 bool
的已定义转换。由于成员变量指针不是NULL
,它们的计算结果为真并打印为1
.
手头的关键问题是指向成员的指针不能转换为 void*
,这是通常处理打印指针的重载所采用的方法。
因此,使用下一个最佳转换,即转换指针->bool
。两个指针都不是空指针,因此你得到了你看到的输出。
如果您尝试打印 "normal" 指针(而不是指向成员的指针),您会得到一些与您最初预期的一致的输出。