由于解压缩的非POD字段而忽略打包属性

时间:2016-02-02 11:58:10

标签: c++ oop types g++ avr

以下代码在使用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);  
}

2 个答案:

答案 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上用您的代码重现警告。