2

うーん、今後の C++0x 標準での複数の auto 宣言について少し混乱しています。

auto a = 10, b = 3.f , * c = new Class();

どこかで読んだことは許可されていません。その理由は (?) でした。連続する宣言が最初の宣言と同じ型 (例では int) を持つべきかどうかが明確ではなかったためです。

可能な翻訳 1:

int a = 10; 
int b = 3.f; 
int * c = new Class ();

エラーの原因

可能な翻訳 2:

int a = 10;
float b = 3.f;
Class * c = new Class (); 

それはどのように標準に帰着しますか?

私の視点で言えば、翻訳#2は、少なくとも私が通常のC ++ユーザーである私にとっては、最も異議を唱えるものでした。つまり、「宣言されたすべての変数は同じ宣言された型です」という意味で、魔女は自動です。翻訳#1は、私にとって本当に直感的ではありません。

さようならQbProg

4

4 に答える 4

6

これはおそらく最新のものではありませんが、2008 年 6 月の C++0x ドラフト標準では、次のことができると述べています。

auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int

したがって、6 月から何かが変更されない限り、これは非常に直感的な解釈で限定された形で許可されます (または許可される予定です)。

制限は、(上記の例を使用して) このように複数の auto 宣言を文字列化したい場合、 と の推論された型が同じ「基本型」(この場合は int) を持ち、不正確な用語を使用するために機能vするuことです。

正確なルールが必要な場合は、ドラフト標準には次のように記載されています。

宣言子のリストに複数の宣言子が含まれている場合、宣言された各変数の型は上記のように決定されます。テンプレート パラメーター U に対して推定される型が各推定で同じでない場合、プログラムは不適切な形式です。

ここで、「推定テンプレート パラメーター U」は次のように決定されます。

次の発明された関数テンプレートの呼び出し f(expr) におけるパラメーター u の推定型:

 `template <class U> void f(const U& u);`

次のようなことを言う代わりに、なぜ彼らはこのルールを思いついたのですか。

auto a = 10, b = 3.f , * c = new Class();

次と同等です。

auto a = 10;
auto b = 3.f;
auto * c = new Class();

知らない。しかし、私はコンパイラを書きません。おそらく、autoキーワードが置換することを理解したら、同じステートメントでそれを変更することはできません。

たとえば、次のとおりです。

int x = 5;
CFoo * c = new CFoo();

auto  a1 = x,       b1 = c; // why should this be permitted if
int   a2 = x, CFoo* b2 = c; // this is not?

いずれにせよ、私は同じステートメントに複数の宣言を置くのが好きではありません。

于 2009-01-29T21:34:42.030 に答える
4

ドラフト標準セクション7.1.6.4は、可能な翻訳2のようにタイプを混在させることができないことを意味します。したがって、どちらの可能な翻訳も有効ではありません。

于 2009-01-29T21:18:58.410 に答える
2

現在の文言に貢献するのに役立つと思われる点がいくつかあります。1つ目は一貫性です。次のような宣言を記述した場合:

int j;
int i = 0, *k = &j;

次に、2 つの型は両方とも型のどこかでintを使用します。たとえば、「j」が「const int」の場合はエラーです。autoを同じように機能させることは、そのような宣言の現在のモデルと「一貫性」があります。

その場合、コンパイラ作成者の観点からは実用的な利点があります。関数呼び出しの型推論を実行するためのコンパイラの機構は既に存在します (これはautoが動作として記述されている方法です)。上記のルールは、テンプレート パラメーターの推論は同じ型になる必要があるというルールと一致しています。

template <typename T> void foo (T, T*);

void bar ()
{
  int i;
  const int j = 0;

  foo (i, &i);  // OK deduction succeeds T == int
  foo (i, &j);  // ERROR deduction fails T == int or const int.
}

autoの簡単な実装は、既存のメカニズムを再利用してautoの型を推測することです。現在の動作との一貫性により、結果は人々にとってそれほど驚くべきものではありません。

最後に、これはおそらく私の意見では最も重要なポイントです。現在のモデルは保守的であり、C++ の既存の言語構造と非常によく似ています。したがって、ショーが停止する言語バグが発生する可能性は非常に低くなります。ただし、現在のモデルは将来簡単に拡張して、質問に挙げた他の例を含めることができます。

さらに、その展開は、autoの現在の文言を使用するコードを壊しません。彼らがこれを逆にしたかどうかを考えてみてください。autoの拡張バージョンが最初のバージョンであり、これによりキーワードに奇妙で致命的な欠陥が生じた場合、標準から言語機能を削除する必要があります。これは、コードを壊す可能性が高いため、ほとんど発生しません。

于 2009-01-30T12:31:16.040 に答える
0

最初のものは、?: 演算子の戻り値の型で型推論がどのように機能するかということと一致します。

于 2009-01-29T21:03:49.907 に答える