web-dev-qa-db-ja.com

C ++ 11のautoキーワードの動機と落とし穴(?)

最近、キーワードautoがC++ 11で選択され、コンパイラによって型を推論されなければならない変数をマークするために、

auto x = 1;

以来

  1. varは、他のプログラミング言語(C#、Scala、JavaScriptなど)で一般的です。
  2. autoの新しいセマンティクスが下位互換性を損なうことを理解している限り(これはめったに使用されませんでしたが、C++の以前のリビジョンでは別の意味がありました。例 here を参照)

autoを選択する特別な理由があるかどうかを尋ねたかった(varまたは他のキーワードを支持した)。 C++ 11標準がリリースされる前に、この問題に関する具体的な議論はありましたか?

また、C++ 11コンパイラでレガシーC++コードを再コンパイルするときに注意すべき非互換性はありますか?

20
Giorgio

言語にキーワードとして追加すると思われるほとんどすべてのWordは、ほぼ確実に変数名または作業コードの他の一部として使用されています。このWordをキーワードにすると、このコードは壊れます。

autoの信じられないほど幸運なことは、それが既にキーワードだったため、人々はその名前の変数を持っていなかったが、それがデフォルトだったので、誰もそれを使用しなかった。入力する理由:

auto int i=0;

いつ

int i=0;

まったく同じ意味ですか?

地球上のどこかに、古い方法で「自動」を使用する少量のコードがあったと思います。しかし、「自動」を削除することで修正でき、再び機能します。そのため、キーワードを転用することはかなり明白な選択でした。

また、もっと明確な意味だと思います。バリアントなどを操作したことがある場合、varが表示されたときに、キーボードですべてのキーを押して変数の型を指定した場合よりも、宣言の型付けがいくぶん強くないと思われるかもしれません。私にとって、autoは、コンパイラーにタイプを自動的に推定するように要求していることを明確にします。したがって、委員会が良い名前を利用できるようになったのは本当に幸運な休憩でした。

(小さな)破損を明確にするには:

もしあったなら

auto int i=0;

c ++ 11コンパイラでコンパイルしようとすると、次のようなエラーが発生します

エラーC3530: 'auto'を他のタイプ指定子と組み合わせることはできません

これは簡単です。autoまたはintを削除して再コンパイルするだけです。

しかし、もっと大きな問題があります。もしあったなら

auto i = 4.3;

Cと本当に古いC++はiintにします(autoを省略した場合のように-デフォルトの宣言はintでした)。このコードをコンパイルせずに非常に長い時間を費やしている場合、または古いコンパイラを使用している場合は、少なくとも理論的にはこのコードの一部を使用できます。 C++ 11は4.3がdoubleであるためです。 (またはfloatかもしれませんが、私はまだボクシングデーモードですが、ポイントはintではありません。)これにより、アプリ全体に微妙なバグが発生する可能性があります。コンパイラからの警告やエラーはありません。このボートに乗っている人はC [C++ 11]コンパイラに移行する前に、古い方法でautoを検索してグローバルに検索する必要があります。幸い、そのようなコードは非常にまれです。

37
Kate Gregory