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


20

私は最近auto、C ++ 11で、コンパイラが型を推測する必要のある変数をマークするためにキーワードを選択した理由を疑問に思いました。

auto x = 1;

以来

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

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

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


9
の新しいセマンティクスはauto後方互換性を破壊する可能性がありますが、11より前のコードでキーワードが使用されるvar頻度と比較して変数名として使用される頻度に応じてauto、委員会は、新しいものを導入するより劇的に互換性を破壊しないと意見を述べたかもしれませんキーワードだろう。
sepp2k

2
「現在のところ、この質問はQ&A形式には適していません。回答は事実、参考資料、または特定の専門知識によってサポートされると考えていますが、この質問は議論、議論、ポーリング、または詳細な議論を促す可能性があります。この質問は改善され、おそらく再開されると思われます。FAQのガイダンスを参照してください。 ":この質問は事実について尋ねています。可能な答えは2つあります。YESとNOです。
ジョルジオ

2
もちろん議論がありましたが、その点で質問は無意味になります。autovarの質問は、あなたのテキストの90%は何を意味しており、その質問には、決定的な結果を持っていません。(私は近くに投票したものではないんだけれども)
Telastyn

1
@Telastyn:このトピックに関する議論があったことを知っていたなら、私は尋ねなかっただろう。「auto vs var C ++」または「auto C ++」のグーグル検索では、このトピックについて何も返されませんでした。
ジョルジオ

1
autovarC#で導入される前にC ++向けに提案されたため、C#がautoを使用しない理由は疑問です。varはJavaScriptとScalaで異なる意味を持っています
adrianm

回答:


37

あなたが言語にキーワードとして追加することを考えるかもしれないほとんどすべての単語は、ほぼ確実に変数名または作業コードの他の部分として使用されています。その単語をキーワードにすると、このコードは壊れます。

信じられないほど幸運なことautoは、それがすでにキーワードだったということです。そのため、その名前の変数はありませんでしたが、デフォルトであるため、誰も使用しませんでした。入力する理由:

auto int i=0;

いつ

int i=0;

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

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

また、それはより明確な意味だと思います。バリアントなどで作業している場合、表示されるときvarに、変数の型を指定するためにキーボードですべてのキーを自分で押した場合よりも、宣言の型付けがやや弱いと思うかもしれません。私にとってはauto、コンパイラに型を自動的に推測するように依頼していることを明確にしています。これは、自分で指定した場合と同じくらい強力です。それで、委員会が良い名前を付けられるようになったのは本当に幸運な休憩でした。

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

あなたが持っていた場合

auto int i=0;

C ++ 11コンパイラでコンパイルしようとすると、次のようなエラーが表示されます。

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

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

しかし、もっと大きな問題があります。あなたが持っていた場合

auto i = 4.3;

Cと本当に古いC ++はなるだろう(それはあなたがオフに左かのように-デフォルト宣言でした)。このコードをコンパイルせずに非常に長い時間を過ごしている場合、または古いコンパイラを使用している場合、少なくとも理論的にはこのコードの一部を使用できます。C ++ 11は4.3 であるため、それを実現します。(または、多分、私はまだボクシングデーモードですが、ポイントは、ではありません。)これは、アプリ全体に微妙なバグを導入する可能性があります。そして、コンパイラからの警告やエラーなし。このボートの人々は、C ++ 11コンパイラーに移行する前に、古い方法で使用していないことを確認するために、全体を検索する必要があります。幸いなことに、そのようなコードは非常にまれです。iintautointdoublefloatintauto


非常に明確な答えをありがとう。+1後方互換性をほとんど無害な方法で落とすことと、古いキーワードが新しいキーワードで壊れないという大きなチャンスを持つこととのトレードオフを理解しています。
ジョルジオ

実際に非互換性はありますか?C ++ 11コンパイラautoは、その後に型名が続く場合は無視しませんか?
aaaaaaaaaaaa

1
Visual C ++ 2012はerror C3530: 'auto' cannot be combined with any other type-specifierその行に言う
ケイトグレゴリー

3
@KateGregory:実際にはauto i = 4.3;、C ++ 03 / C ++ 98では形式が正しくないため、問題ありません。C ++は、C89が持っていた(そしてC99リビジョンで廃止された)「暗黙のint」ルールを引き継ぎませんでした
バートヴァンインゲンシェナウ

1
@ケイト・グレゴリー:バートの意見を考慮に入れて、それに応じて答えを変えることができれば、私はそれを受け入れられた答えとしてマークします。
ジョルジオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.