10

宣言者。はい、宣言者。それらは多くのコーディング規約の議論の源です。これは議論にとって本当に良いトピックです-C++は、どちらがもう一方よりも優れているかを決定しません(気にしません!)。そして、誰かがあなたをからかうかもしれないことを心配することなく、これらを書くことができます:

int x;

int& a = x;
int &b = x;

int* c = &x;
int *d = &x;

構文的にbd、他のものより「有効」です。名前の前に宣言子修飾子を付ける必要があります。

int m, *n;   // m is an int; n is a pointer to int

しかし、流れは1つに有利になっているようです。C ++ 11の可変個引数テンプレートでは、宣言子の位置は、修飾子が基本タイプに近い形式に制限されているようです。

template<typename... Ts>
void VariadicFuncRef(const Ts&... args) { }
                             ^
template<typename... Ts>
void VariadicFuncPtr(Ts*... args) { }
                       ^

これらのフォームを書くのは誤りです:

template<typename... Ts>
void VariadicFuncRef(const Ts... &args) { }

template<typename... Ts>
void VariadicFuncPtr(Ts... *args) { }

具体的な例については、ここをクリックしてください

それで、私の質問はこれです: なぜ私たちはこの(合法的な)形式に制限され、他の形式を使用できないのですか?

何か考えはありますか?

追加1:この「ルール」が「強制」される理由に関する設計上の決定にも関心があります。

4

3 に答える 3

4

古い宣言子の構文は、空白がほとんどない1つのルールでしたが、あなたの考えは2つです。委員会が、1つで十分な場合に、2つのルールを持つことに賛成するのではないかと思います。

宣言者を左側に配置するという選択は、おそらく2つの理由で行われました。

  • 最近では、慣用的なC ++の方が優先int* xint *xれます(たとえば、Bjarneは前者を使用します)。ほとんどの場合、宣言子の構文は間違いだと考えています。
  • パラメータパックの展開は...、右側ではなく左側に展開されます。
于 2012-12-19T07:55:12.693 に答える
3

int &aまず第一に、私はそれがより有効であるとは言いませんint& a。あなたはそれがより読みやすい、または良い習慣であると言うかもしれませんが、それはまったく別のことです。

第2に、パラメーターunpack構文は、 「左側のtype-patternが展開され、type-patternの形式に一致する同じまたは異なる実際の関数パラメーター型を形成するT...」と読み取ることができます。したがって、と書くと、に展開できます。しかし、構文がである場合、それは(少なくとも私には)それほど明白ではないようです。それで、多分、それは標準がそれをそのようにした他のいくつかの考えられる理由の1つです。...f(T&...)f(int&, float&, double&, Xyz&, Abc&)T...&

argsまた、 inT&...argsオプションであることに注意してください。したがって、それを書かないと、void f(T...&)(少なくとも私には)奇妙に見え、void f(T&...)少なくとも美的には良く見えます。

T * const & ...:とのような構文を比較することもできますT... * const &タイプパターンは、前者の構文の方が後者よりも明白です。

于 2012-12-19T07:53:13.853 に答える
2

追加するものが何もないときではなく、取り除くものが残っていないときに、完璧が達成されます。

--アントワーヌドサンテグジュペリ

プログラミング言語の設計の難しさは、機能を追加することではなく、機能を追加しないことです。すべての機能、構文のすべてのバリエーションには、次のコストがかかります。

  • それらはコンパイラで特別にコーディングする必要があります
  • それらはバグを導入するリスクをもたらします
  • それらは別の機能/バリエーションとひどく相互作用するリスクをもたらします
  • ..。

CおよびC++の構文は、(ほとんど)空白の影響を受けないため、どこに配置してもかまいません。&どちら*の設定も、余分な負担をかけずに共存できます。ただし、可変個引数テンプレートの場合は、...トークンがあるため重要です。したがって、委員会は1つを選択することを決定し、C ++で最も慣用的なものを選択しました(基本タイプではなくフルタイプに重点を置いています)。

于 2012-12-19T08:39:57.810 に答える