Развивает ли кастинг между 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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