2008-10-16 6 views

Répondre

30

Que signifie "const class"? Il semble compiler ok.

Pas pour moi ce n'est pas le cas. Je pense que votre compilateur est juste poli et l'ignore.

Édition: Oui, VC++ ignore silencieusement la const, se plaint GCC.

+3

Je vais dire qu'il ressemble à un cas de bord que VC++ se trompe –

+0

On dirait; le 'const' n'affecte pas ce que je peux trouver. –

+0

VC++ digère vraiment beaucoup de code mal formé (j'utilise 2013 maintenant). Il semble qu'ils l'ont testé juste pour des chemins heureux. – ubik

17

Si vous aviez ceci:

alors cela signifierait clairement que 'a' est const. Sinon, je pense que C++ est probablement invalide.

+0

Bonnes vieilles caractéristiques oubliées de C++! Je me souviens avoir fait des trucs comme ça en C il y a longtemps. –

41

Le const n'a pas de sens dans cet exemple, et votre compilateur devrait vous donner une erreur, mais si vous l'utilisez pour déclarer des variables de cette catégorie entre la fermeture } et le ;, puis qui définit les cas comme const, par exemple:


const class A 
{ 
public: 
    int x, y; 
} anInstance = {3, 4}; 

// The above is equivalent to: 
const A anInstance = {3, 4}; 
+2

Je ne trouve pas de justification pour faire de cette erreur une erreur. Les compilateurs peuvent émettre des avertissements à volonté, mais seul le standard détermine ce qui compte comme une erreur. – MSalters

+0

Parce que vous déclarez quelque chose comme const qui ne l'est pas. C'est quelque chose qui n'est jamais ce que vous voulez faire, et devrait donc être une erreur. La norme devrait déterminer ce qui est correct. définir toutes les mauvaises choses serait trop de travail. – Bernard

+0

Je pense que le terme utilisé dans la norme est "illformed". La norme ne dit pas ce qui n'est pas autorisé, seulement ce qui est. Cette syntaxe C++ n'est pas valide, elle n'est donc pas autorisée. – KeithB

7

Il n'a pas de sens, sauf si vous déclarez une instance de la classe après, comme cet exemple:

const // It is a const object... 
class nullptr_t 
{ 
    public: 
    template<class T> 
     operator T*() const // convertible to any type of null non-member pointer... 
    { return 0; } 

    template<class C, class T> 
    operator T C::*() const // or any type of null member pointer... 
    { return 0; } 

    private: 
    void operator&() const; // Can't take address of nullptr 

} nullptr = {}; 

unintermédiaireimplémentation si vous attendez C++ 0x.