Развивает ли кастинг между T* и Union {Pointer, t}** нарушает правила строгого псевдонимы в C ++?C++

Программы на C++. Форум разработчиков
Anonymous
Развивает ли кастинг между T* и Union {Pointer, t}** нарушает правила строгого псевдонимы в C ++?

Сообщение Anonymous »

Я внедряю неинтрузивную ObjectPool в C ++, используя союз внутри структуры, нарушает ли этот код правило строгого псевдонимы? Чтобы достичь этого, я использую союз внутри узла структуры: < /p>
template
struct IdlePool{
public:
struct Node { // sizeof (T) >= 8bytes;
union {
Node* next;
T value;
};
};
public:
Node* head = nullptr;
public:
void push(T* value) {
auto node = (Node*)(value); // ❶
node->next = head;
head = node;
}
T* pop() {
auto ret = head;
if (head) head = head->next;
return (T*)(ret); // ❷
}
};

struct Data {
int a, b,c=10;
};
int main(){
auto a = new Data;
auto b = new Data;
IdlePool pool;
pool.push(a);
pool.push(b);

auto c = pool.pop();
std::construct_at(c, 1,2,3); // ❸
std::println("{}{}{}", c->a, c->b, c->c);
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-rules-i

Вернуться в «C++»