class
次のようにその前に単語を書くだけで、コンストラクターをプライベートセクションとパブリックセクションのないクラスとして扱うと、プログラムがコンパイルおよび実行される理由を教えてください。
class sample
{
private:
int a,b;
public:
class sample(int a1){a = a1;}
};
class
次のようにその前に単語を書くだけで、コンストラクターをプライベートセクションとパブリックセクションのないクラスとして扱うと、プログラムがコンパイルおよび実行される理由を教えてください。
class sample
{
private:
int a,b;
public:
class sample(int a1){a = a1;}
};
それは有効ではなく、私のコンパイラはそれを拒否します。class
コンストラクターは、クラス キーを使用せずにクラス名を使用して宣言する必要があります (つまり、nostruct
またはunion
キーワード)。
おそらく、コンパイラは複雑な型指定子をコンストラクタ名として受け入れます。しかし、もしそうなら、それは非標準の拡張であり、それに頼るべきではありません。運が良ければ、コンパイラは拡張機能を無効にするオプションを提供するかもしれません。これは、そのコンパイラに永遠に縛られたくない場合に使用する必要があります。
あなたが提供したコードは仕様に違反しており、技術的にコンパイルすべきではありません:
12.1 コンストラクタ
1コンストラクターには名前がありません。コンストラクターの宣言または定義には、特別な宣言子構文が使用されます。構文は次を使用します。
— オプションの decl-specifier-seq で、各 decl-specifier は function-specifier または constexpr のいずれかです。
— コンストラクターのクラス名、および
— パラメータリスト
その順序で。このような宣言では、コンストラクター クラス名を囲むオプションの括弧は無視されます。
( function-specifierはinline
、virtual
、またはexplicit
-- 7.1.2/1 を参照 -- ただし、仮想コンストラクターは 12.1/4 では許可されていません)
ただし、Microsoft Visual C++ 2012 および 2013 (少なくとも) はそれを受け入れます。これは、これらのコンパイラのバグのようです。
更新: Microsoft はこの問題を認識していますが、(当然のことながら) わざわざ修正しないことにしました。