これはおそらく最新のものではありませんが、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?
いずれにせよ、私は同じステートメントに複数の宣言を置くのが好きではありません。