26

引用元: cppreference

C++11 まで:

抽出に失敗した場合 (たとえば、数字が必要な場所に文字が入力された場合)、値は変更されず、failbit が設定されます。

C++11 以降:

抽出に失敗した場合、値にゼロが書き込まれ、failbit が設定されます。抽出の結果、値が大きすぎたり小さすぎたりして値に収まらない場合、std::numeric_limits<T>::max()またはstd::numeric_limits<T>::min()書き込まれ、failbit フラグが設定された場合。

この変更により、これは次のスニペットを意味します。

int x = 1;
std::cin >> x;
return x;

数値変換が失敗した場合、1C++11 より前に戻り0ます。

標準化委員会は、なぜこのような微妙な重大な変更を導入するのでしょうか? というか、この変更を保証する C++11 より前のコードはどのようなものでしたか?

4

2 に答える 2

2

const非参照入力にゼロを格納し、xエラーが発生した場合に元の値を返すのは、C++ の方法です。

エラー状態の場合に元の値を保持するために、ライブラリは一時的に動作する必要があります。x元の値をどこかに保存せずに、提供されたスペースを単純に使用することはできません。x次に、エラー状態が判明したら、ある時点でコピーを実行する必要がある場合もあります。エラーまたは読み取り入力がある場合、元の値を取得するにはどうすればよいでしょうか。したがって、この動作を望んでいるかどうかに関係なく、誰もが代償を払います。

したがって、エラーが発生した場合に元の値を返すことは、C++ ではまったくありません。その動作が必要な場合は、自分で支払うだけです-一時的なものを作成し、その非const参照をoperator>>次のように渡します。

int x = 1;
int temp;
if (std::cin >> temp) 
    x = temp;
return x;
于 2016-01-08T04:44:46.533 に答える