どのようにC ++ 0xの標準はC ++の自動複数の宣言を定義しますか?
質問
MMM、私は今後のC ++ 0xの標準で複数の自動宣言についてほんの少し混乱しています。
auto a = 10, b = 3.f , * c = new Class();
私が読んどこかでそれが許可されていません。 その理由でした(?)の連続した宣言は最初の1、(例では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 ();
どのようにそれが標準になったのですか?
私は私のPOVを言うことができる場合は、、翻訳#2は、私は、通常のC ++ユーザーだと、少なくとも私にとっては、最もobiouvsました。私は意味、私のために「宣言されているすべての変数が同じ宣言型である」、魔女はautoです。 翻訳#1は私には本当に非直観的になります。
グッバイ QbProg
解決
これはおそらく、最新ではありませんが、私のC ++ 0xのドラフト規格2008年6月からは、あなたが次のことを行うことができますと言います:
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月から変更されていない限り、だから、これは(または予定)かなり直感的な解釈に限定された形で許可されます。
の制限は、あなたが(上記の例を使用して)このような文字列複数の自動宣言したいならばv
とu
の推論された型が使用する同じ「基本型」(この場合はint)を持っているので、それが動作することです不正確な用語ます。
、ドラフト規格はこれを言います:
宣言子のリストが複数の宣言が含まれている場合は、、各宣言された変数の型が記載されているように決定されます 上記。テンプレートパラメータ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?
いずれにせよ、私はとにかく同じ文で複数の宣言を置くのファンではない。
他のヒント
ドラフト標準のセクション7.1.6.4は、あなたがそうでもない可能性翻訳が有効である可能性翻訳2のようなタイプを混在させることはできませんことを意味します。
私は現在の文言に貢献だと思ういくつかのポイントがあります。最初は一貫性です。
:次のような宣言を記述する場合int j;
int i = 0, *k = &j;
次に、二つのタイプは、のint型のどこかに自分のタイプを使用して両方。 「jは」「のconst int型」だった場合は、例えばエラーです。 の自動の同じ動作を持つことは、そのような宣言の現行モデルとの「整合性」である。
、コンパイラライターの視点から実用上の利点があります。すでに(の自動のは、オペレーティングとして記述されている方法です)関数呼び出しの型推論を実行するためのコンパイラで機械が存在します。上記のルールは、テンプレートパラメータのための控除は、同じ型になる必要があることをルールと一致してます:
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.
}
の自動のはの自動のための種類を推定するために、既存の仕組みを再利用することであり、なぜなら現在の行動との整合性の結果はあまりにも驚くべきことではありませんのために簡単に実装人へ。
最後に、これはおそらく、私の意見の中で最も重要なポイントです。現在のモデルは保守的であり、C ++での既存の言語構造と非常によく似た働きを。したがって、ショーの停止言語のバグが得られ、それの可能性は非常にスリムです。しかし、現在のモデルは、簡単にあなたがあなたの質問に一覧表示し、他の例を含むように、将来的に拡張することができます。
しかも、その拡張は、の自動の現在の文言を使用するコードを中断されません。彼らは他の方法でラウンドこれをした場合を検討してください。 の自動のの拡張版は、最初のバージョンであり、このキーワードでいくつかの奇妙な、致命的な欠陥が生じ、それは標準から言語機能の除去が必要となる場合 - として起こることはほとんどない何かをそれは最も可能性の高いコードを壊します。
最初のものは、種の型推論は、の戻り値の型にどのように機能するかと整列う