为什么对于同一结构体的不同成员,指向成员的指针的值总是相同的?
Why is the value of a pointer-to-member always the same for different members of the same struct?
我有以下代码:
#include <iostream>
#include <string>
using namespace std;
struct foo_s {
string a;
string b;
string c;
};
void print_field(foo_s* foo, string foo_s::* field) {
cout << "field: " << field << " - " << foo->*field << endl;
}
int main() {
foo_s my_foo = {
"a",
"b",
"c",
};
print_field(&my_foo, &foo_s::a);
print_field(&my_foo, &foo_s::b);
print_field(&my_foo, &foo_s::c);
return 0;
}
输出为:
field: 1 - a
field: 1 - b
field: 1 - c
我在理解print_field()
函数中发生的事情的细节方面有点困难。即:
-
field
是什么类型的?我猜是pointer-to-string-foo_s-member
- 为什么
field
的值总是相同的(在这种情况下是1),而foo->*field
产生不同的结果?
主要是我对第2点感到困惑。我想象字段将是结构体开始的"偏移量",foo->*field
将在概念上等同于
char* ptr = static_cast<char*>(foo);
ptrdiff_t offset = somehow_get_the_byte_offset_from_pointer_to_member(field);
ptr = ptr[offset];
string result = *static_cast<string*>(ptr);
,但这似乎是出来的,因为field
的值在调用中没有变化。我错过了什么?这个具体的操作是如何被标准描述的?
<<
没有重载来格式化成员指针的值,所以如果您尝试的话,不会得到任何特别有用的东西。bool
有一个重载,成员指针可以转换为bool
,这就是这里发生的事情。该指针不是空的,所以它转换为true
,默认格式为1
。
为了进一步演示,您可以先尝试流式传输boolalpha
;那么你应该看到true
而不是1
。
-
如您所说,
field
的类型是指向foo_s
的std::string
类型成员的指针。 -
在所有这些情况下,
field
的值都是1
,因为指向成员的指针可以转换为bool
,所以当你输出它们时,你得到的是1
,因为它们不是空的。
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制