0

なぜ istringstream は接尾辞付きの数値リテラルを完全に読み取れないように見えるのでしょうか?

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    long long x = 123ULL; // shows 123ULL is a valid long long literal

    istringstream iss("123ULL");

    iss >> x;
    cout << "x is " << x << endl;

    char extra;
    iss >> extra;
    cout << "remaining characters: ";
    while(!iss.eof())
    {
        cout << extra;
        iss >> extra;
    }
    cout << endl;

    return 0;
}

このコードの出力は

x is 123
remaining characters: ULL

この動作はロケールによって制御されますか? で受け入れられる文字列に関する明確なドキュメントを誰かに教えてもらえistringstream::operator>>(long long)ますか?

4

1 に答える 1

1

はい、(num_getファセットを介して) ロケールによって制御されますが、C++ 言語リテラルをサポートしていると聞いたことがあるロケールはありません。これをカスタマイズするのは適切ではありません。

ストリームは汎用 I/O 用であり、C++ 整数リテラル サフィックスは非常に特殊化されています。

defaultnum_getファセットの正確な動作は、セクション 22.4.2.1 の C++11 標準で説明されています。説明strto*では、C 標準ライブラリの関数ファミリを部分的に参照しています。ここでやや要約したバージョンを見つけることができます:

http://en.cppreference.com/w/cpp/locale/num_get/get

于 2013-12-10T16:08:49.943 に答える