Здравствуйте, N. I., Вы писали:
NI>С такими кадрами, чувствую, следующие 4 года начнутся очень скоро
Каков Ваш там выше пример, таков и ответ. Конструкции T::x и T::*x в С++ имеют особое значение и нечего за них цепляться. Значение &T::x вообще равно смещению поля в пределах объекта в байтах, а не значению виртуального адреса поля объекта.
Если же прогнать такой код
include <cstring>
#include <iostream>
struct S
{
int i, j;
int *p;
};
#define PRINT_VALUE(expr) std::cout << #expr ": " << (expr) << std::endl;
int main()
{
S s = S();
std::cout << std::boolalpha;
PRINT_VALUE(s.p == 0);
PRINT_VALUE(s.p == &s.i);
PRINT_VALUE(s.p == &s.j);
std::memset(&s, 0, sizeof(s));
std::cout << "bytewise zeroing" << std::endl;
PRINT_VALUE(s.p == 0);
PRINT_VALUE(s.p == &s.i);
PRINT_VALUE(s.p == &s.j);
}
То выхлоп будет таким
value-initialization
s.p == 0: true
s.p == &s.i: false
s.p == &s.j: false
bytewise zeroing
s.p == 0: true
s.p == &s.i: false
s.p == &s.j: false
Что доказывает, что memset даёт те же зачения полям, что и другие способы обнуления.