ここではC++の1日目で学んだことはありますが、これは当然のことですが、標準の文言からはっきりとは分かりません。名前空間スコープのコンストラクタ定義でクラス修飾識別子が必要ですか?
クラスS
考える
、我々はそのコンストラクタ
struct S { S(); };
S::S() { … }
を定義することができますが、標準では全く同じように、これを許可しているようだ:常に許可され
struct S { S(); };
S() { … }
自体を持つクラスの名前を予選常に冗長です。たとえば、S::S::S::S() { … }
も有効な宣言です。 S::S
の場合、どうして普通ではないのですかS
? C++ 11§12.1/ 1から
、
コンストラクタは名前がありません。特殊な宣言子構文を使用して、コンストラクタを宣言または定義します。構文は、使用しています:
- オプションの各供述指定子は、関数指定子またはconstexprのいずれかがある、供述指定子-seqの、
- コンストラクタのクラス名、および
- パラメータリストを
の順番である。
これは、クラスまたは名前空間のスコープにも等しく適用されます。名前空間の範囲に関する§9.3/ 5の特別な規則があります。
メンバ関数の定義が字句的にクラス定義の外にある場合、メンバ関数名は:: operator 。
しかし、コンストラクタは名前を持っていないので、これは、右は適用されませんか?さらに、構文的なあいまいさがないため、資格を必要とする理由はありません。識別子の戻り値の型およびクラス名で宣言された関数は、現在観察されている規則の下では常に構文エラーです。右?
修飾子を省略してコードを書く必要はありませんが、コンパイラがこれを受け入れる理由はないのでしょうか、それは単に伝統ですか?
あなたは恥ずかしい気がします。私はそれに続く議論に興味があります。 –
誰がこれに-1を与えましたか?なぜ? – Nim
@ニム:誰かが自分の最愛の言葉にしていることを好まないと思う。残念ながら、私の担当者の得点は5の倍数から2になり、私はこの質問に対する答えを受け入れることができます。 – Potatoswatter