1

Pour le code suivant:Membre de l'Union a Constructor défini par l'utilisateur-

class Foo{ 
    int foo; 
public: 
    Foo() : foo(13) {} 
    int getFoo() const { return foo; } 
}; 

union Bar{ 
    Foo fBar; 
    double dBar; 
}; 

Je crois que cela est tout à fait légale en C++. http://en.cppreference.com/w/cpp/language/union#Explanation dit:

If two union members are standard-layout types, it's well-defined to examine their common subsequence on any compiler

Et ainsi in gcc I can do this:

Bar bar = { Foo() } 

Lorsque je tente dans Visual Studio 2008 je reçois l'erreur:

error C2620: member Bar::fBar of union Bar has user-defined constructor or non-trivial default constructor

Error C2620 états:

A union member cannot have a default constructor.

Que se passe-t-il ici? Était-ce toujours une exigence C++, je pensais que la mise en page standard était la seule exigence? Y a-t-il un travail pour ça?

+1

VS2008 ne comprend pas un compilateur C++ 11. Vous aurez besoin de mettre à niveau si vous voulez utiliser les fonctionnalités de langage introduites en C++ 11 –

+0

J'irais avec la mise à jour 3 de 2015 si vous voulez obtenir la plus grande conformité C++ 11 possible. – NathanOliver

+0

@CaptainObvlious Ce n'était pas une fonctionnalité C++ 11, Et l'erreur est toujours répertoriée dans Visual Studio 2013: https://msdn.microsoft.com/en-us/library/43ae0055(v=vs.120). aspx –

Répondre

2

Dans C de 98/03 de la norme C++ indiqué dans 9,5

[...]If a POD-union contains several POD-structs that share a common initial sequence (9.2), and if an object of this POD-union type contains one of the POD-structs, it is permitted to inspect the common initial sequence of any of POD-struct members;[...]

Et cela a été changé en 11 C++ pour

[...]If a standard-layout union contains several standard-layout structs that share a common initial sequence (9.2), and if an object of this standard-layout union type contains one of the standard-layout structs, it is permitted to inspect the common initial sequence of any of standard-layout struct members;[...]

Alors avant C++ 11 vous pourriez seulement utilisez un type POD dans une union, ce qui signifie que MSVS 2008 vous donne la bonne erreur. Pour utiliser le nouveau type d'union, vous devez obtenir la version de MSVS qui prend en charge ce changement. De this MSDN article nous pouvons voir dans la section pour les syndicats Unrestricted que ce changement n'a pas été fait jusqu'à la version 2015.

Vous allez devoir soit mettre à niveau ou changer la classe d'être un POD type

+0

Donc, il semblerait que http://en.cppreference.com a tort alors? Donc, ma citation dans la question aurait dû être contenue dans le bloc C++ 11? –

+1

@JonathanMee Regarde comme ça. Le jist a raison, mais la terminologie a changé. – NathanOliver