ignoring packed attribute because of unpacked non-POD field

谁都会走 提交于 2019-12-22 05:50:10

问题


The following code gives me this error when compiled with avr-g++ compiler ignoring packed attribute because of unpacked non-POD field 'float& foo::BAR'

what is the reason?

class foo {  
 public:       
     foo(float &bar);    
 private:  
     float &BAR;  
};

foo::foo(float &bar):BAR(bar)  
{

}

int main()  
{  
 float something;  
 foo fooobject(something);  
}

回答1:


It appears to be a compiler bug : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58798.




回答2:


I don't know about your case in particular, but just to clarify for other Googlers, the warning makes sense when you actually __attribute__((packed)) as in:

#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>());

then with GCC 8.1.0:

g++-8 -std=c++17 -c a.cpp

it warns:

a.cpp:12:7: warning: ignoring packed attribute because of unpacked non-POD field ‘D E::d’
     D d;
       ^

because as explained at: What are POD types in C++? the data contained inside PODs is not well defined by the standard, and therefore intuitively __attribute__((packed)) won't give you much in that case.

In particular, the reference member in your example makes foo non-POD as of C++17, although of course you are not using __attribute__((packed)) so the warning does not make sense.

I cannot reproduce the warning with your code on Ubuntu 16.04 AMD64.



来源:https://stackoverflow.com/questions/35152877/ignoring-packed-attribute-because-of-unpacked-non-pod-field

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!