以下代码在使用avr-g ++编译器编译时给出了此错误 忽略打包属性,因为解压缩的非POD字段' float& FOO :: BAR'
是什么原因?
class foo {
public:
foo(float &bar);
private:
float &BAR;
};
foo::foo(float &bar):BAR(bar)
{
}
int main()
{
float something;
foo fooobject(something);
}
答案 0 :(得分:4)
它似乎是一个编译器错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58798。
答案 1 :(得分:1)
我不特别了解您的情况,只是为了向其他Google员工澄清,当您实际__attribute__((packed))
时,该警告才有意义:
#include <type_traits>
struct C {
int i;
};
struct D : C {
int j;
};
struct E {
D d;
} __attribute__((packed));
static_assert(std::is_pod<C>());
static_assert(!std::is_pod<D>());
static_assert(!std::is_pod<E>());
然后使用GCC 8.1.0:
g++-8 -std=c++17 -c a.cpp
它警告:
a.cpp:12:7: warning: ignoring packed attribute because of unpacked non-POD field ‘D E::d’
D d;
^
由于在What are POD types in C++?中进行了解释,因此该标准未对POD中包含的数据进行很好的定义,因此,在这种情况下,直观上__attribute__((packed))
不会给您带来太多帮助。
特别是,示例中的参考成员从C ++ 17开始使foo
为非POD,尽管您当然没有使用__attribute__((packed))
,所以警告没有意义。
我无法在Ubuntu 16.04 AMD64上用您的代码重现警告。