c++ - 为什么指向成员的指针的值对于同一结构的不同成员总是相同的?

标签 c++ language-lawyer pointer-to-member

我有以下代码:

#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() 函数中发生的事情的具体细节时遇到了一些麻烦。即:

  1. 字段 的类型是什么?我想它是 pointer-to-string-foo_s-member
  2. 为什么 field 的值总是相同(在本例中为 1),而 foo->*field 却产生不同的结果?

主要是,我对第 2 点感到困惑。我想象 field 是从结构开始的“偏移量”, 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 .

关于c++ - 为什么指向成员的指针的值对于同一结构的不同成员总是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30262521/

相关文章:

c++ - 从指向基类成员的指针进行模板推导

c++ - 从成员函数指针获取方法的返回类型

java - java或c++中的邻接矩阵来查找连接的节点

c++ - boost.asio.detail.read_op 是什么意思?

c++ - Plesk 管理面板 C/C++ API 示例

c++ - 从 C++/C 设置全局 LUA_PATH 变量?

c++ - 迭代器的运算符 * 可以按值返回吗?

c++ - 在模板中定义友元函数的实例化

c++ - 将 unsigned char* 强制转换为 char* 并将取消引用的指针视为它真的指向 char 是否安全?

c++ - 将函数转换为成员函数