重複の可能性:
C ++0xautoキーワードでは多すぎます
重要なポイントの近くで「自動」を使用すると、問題が発生する可能性があります。
これはサンプルコードです:
#include <iostream>
#include <typeinfo>
#include <limits>
using std::cout;
using std::endl;
using std::numeric_limits;
using std::cerr;
int main() {
auto i = 2147483647 /* numeric_limits<int>::max() */ ;
cout << "The type of i is " << typeid(i).name() << endl;
int count = 0;
for (auto i = 2147483647;
i < 2147483657 /* numeric_limits<int>::max() + 10 */ ; ++i) {
cout << "i = " << i << " " << endl;
if (count > 30) {
cerr << "Too many loops." << endl;
break;
}
++count;
}
return 0;
}
「auto」は「i」のタイプが整数であると判断しますが、整数の上限は2147483647であり、簡単にオーバーフローします。
これがIdeone(gcc-4.5.1)とLWS(gcc-4.7.2)の出力です。それらは異なります。「i」はIdeone(gcc-4.5.1)のループでは2147483647のままであり、 LWS(gcc-4.7.2)ではオーバーフローします。しかし、それらのどれも期待される結果ではありません:10サイクル、毎回+1。
重要なポイントの近くで「自動」を使用することは避けるべきですか?または、ここで「自動」を適切に使用するにはどうすればよいですか?
更新:誰かが「あなたができるところならどこでも自動を使う」と言います。このスレッドであなたは私に言います。私はそれが完全に正しいとは思いません。ここでは、「longlongint」と入力する方が「int」と入力する方が適切です。どこで「自動」を安全に使えるのか、どこで使えないのかしら。
更新2:ハーブサッターによる記事の解決策4(b)が質問に答えているはずです。