Здравствуйте, vopl, Вы писали:
V>>Или собственное непонимание, ведь стандарт описан не для домохозяек, а для специалистов с неким ненулевым бэкграундом.
V>у вас тут секта грубиянов чтоли?
Дык, вы ж не показали понимание прочитанного в стандарте.
Давай я покажу тебе суть того UB, на который вы ссылаетесь, где этот UB можно получить безо-всяких реинтерпретаций/хаков:
#include <vector>
#include <iostream>
class SomeObj;
class Registrar {
std::vector<SomeObj*> regs_;
int index {};
public:
void registerObj(SomeObj * obj);
void incrementAll();
};
class SomeObj {
public:
SomeObj(Registrar & reg) {
reg.registerObj(this);
}
int index {};
};
void Registrar::registerObj(SomeObj * obj) {
obj->index = index++;
regs_.push_back(obj);
}
void Registrar::incrementAll() {
for(auto * obj : regs_)
obj->index++;
}
Registrar registrar;
int main() {
const SomeObj obj1 = SomeObj(registrar);
const SomeObj obj2 = SomeObj(registrar);
std::cout << obj1.index << ", " << obj2.index << std::endl;
registrar.incrementAll();
std::cout << obj1.index << ", " << obj2.index << std::endl;
}
Из конструктора SomeObj протекла неконстантная отсылка к this.
Выведет:
0, 1
1, 2
До С++17 некоторые компиляторы падают во время исполнения, некоторые выдают мусор. ))