ignoring packed attribute because of unpacked non-

2019-06-22 14:43发布

问题:

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.



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