Почему я не могу вернуть ссылку на упакованное поле?

Я использую g ++ для компиляции кода с упакованными полями. Тем не менее я получаю сообщение об ошибке при попытке вернуть ссылку на упакованное поле.

Пример:

struct __attribute__((packed)) Foo {
int* ptr;
uint16_t foo;
int*& getPtr(){
return ptr;
}
};

выдает ошибку:

test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’
return ptr;

Почему я не могу вернуть ссылку на упакованное поле?

10

Решение

Есть отчет об ошибке gcc Невозможно связать упакованное поле это охватывает это и говорит:

Спецификация C ++ (C ++ 03, разделы 3.9, 3.9.1, 3.9.2) очень ясно показывает, что T и «указатель на T» имеют специфические для реализации требования выравнивания. Если у вас есть «указатель на T», то вы можете предположить, что он соответствует требованиям выравнивания. Я уверен, что спецификация C имеет похожий язык.

В случае OP следующий код может нарушать требования выравнивания

Они предлагают обходной путь, используя alignment атрибут, чтобы определить свой собственный выровненный тип, но он не выглядит, как работает.

2

Другие решения


По вопросам рекламы [email protected]