Получение длинных длинных с суффиксом из istringstream (C++)

Почему же 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)?

1 ответ

Решение

Да, это контролируется языком (через num_get facet), но ни одна локаль, о которой я когда-либо слышал, не поддерживает литералы языка C++, и было бы неправильно настраивать это.

Потоки предназначены для ввода-вывода общего назначения, а целочисленные литеральные суффиксы C++ очень специализированы.

Точное поведение по умолчанию num_get Фасет описан в стандарте C++11 в разделе 22.4.2.1. Описание частично ссылается на strto* семейство функций из стандартной библиотеки C. Вы можете найти несколько сокращенную версию здесь:

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

Другие вопросы по тегам