Hmm. Now I'm confused too. Did this behaviour change in C++11?
Edit: or well I'm not sure actually :P, any experts on this?
Hmm. Now I'm confused too. Did this behaviour change in C++11?
Edit: or well I'm not sure actually :P, any experts on this?
WTF? It just ate the important parts of my post... editing to try and add it back in...
What I tried to write:
Not an expert, but I was just writing a response about this...
Consider the following:
#include <type_traits>
#include <iostream>
struct Foo {
Foo() : x(0), y(0) {}
int x;
int y;
};
struct Bar {
Bar() = default;
int x;
int y;
};
int main()
{
if (std::is_pod<Foo>::value) std::cout << "Foo is a POD" << std::endl;
else std::cout << "Foo is *not* a POD" << std::endl;
if (std::is_pod<Bar>::value) std::cout << "Bar is a POD" << std::endl;
else std::cout << "Bar is *not* a POD" << std::endl;
}
Let's look at what's going on...
Section 12.1, paragraph 5
A default constructor for a class X is a constructor of class X that can be called without an argument. If
there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared
as defaulted (8.4). An implicitly-declared default constructor is an inline public member of its class.
...
A default constructor is trivial if it is neither user-provided nor deleted and ...
(note the last line, so Foo's constructor is not trivial because it is user-provided)
So let's look at what a POD is:
Section 9, paragraph 10
A POD struct is a class that is both a trivial class and a standard-layout class, and has no non-static
data members of type non-POD struct, non-POD union (or array of such types).
So now we ask, is Foo a trivial class?
Section 9, paragraph 6
A trivial class is a class that has a trivial default constructor (12.1) and is trivially copyable.
Nope, looks like Foo is not a trivial class, because it does not have a trivial default constructor, therefore it cannot be a POD.
Note that this is for C++11. I'd have to read through C++03 more thoroughly to be able to comment on C++03.
Ok, this was bugging me, but I think it makes sense.Though, it does say you have to add a default constructor to the union if you do... so still something unexplained going on with the union...
Well, my point was that the reason that swiftcoders code compiled wasn't because the struct was POD (it wasn't), but because unions now allow non-POD members.
There was certainly a change to the definition of PODsThe change in C++11 is to unions.
Well, my point was that the reason that swiftcoders code compiled wasn't because the struct was POD (it wasn't), but because unions now allow non-POD members.
There was certainly a change to the definition of PODsThe change in C++11 is to unions.
Ah, that makes sense now. I didn't realize it was directed at his post.
Wow. Maybe you should change your codebase over to D. Because if 3 C++ experts (or advanced users) are all confused about what is standard, then debug hell must have more than 9 circles.