Code Review Comments

Started by
16 comments, last by Alpha_ProgDes 11 years, 1 month ago

Hmm. Now I'm confused too. Did this behaviour change in C++11?

Seems so: http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/7189821#7189821

Edit: or well I'm not sure actually :P, any experts on this?

Advertisement

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;
}

This outputs:

Foo is *not* a POD
Bar is a POD

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.

[size=2][ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]
The change in C++11 is to unions.

From the wikipedia page: "Unions can now contain objects that have a non-trivial constructor." and "If so, the implicit default constructor of the union is deleted, forcing a manual definition."

So, its ok to have non-POD classes in unions now.
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...

The change in C++11 is to unions.

There was certainly a change to the definition of PODs

[size=2][ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

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...

Ok, this was bugging me, but I think it makes sense.

You can have as many user-defined constructors as you like, but you have to have a default constructor, so that the compiler can construct an instance when it needs to.

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]


The change in C++11 is to unions.

There was certainly a change to the definition of PODs


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.

The change in C++11 is to unions.

There was certainly a change to the definition of PODs

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.

Ah, that makes sense now. I didn't realize it was directed at his post.

[size=2][ I was ninja'd 71 times before I stopped counting a long time ago ] [ f.k.a. MikeTacular ] [ My Blog ] [ SWFer: Gaplessly looped MP3s in your Flash games ]

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.

Beginner in Game Development?  Read here. And read here.

 

This topic is closed to new replies.

Advertisement