Можно ли инициализировать переменную с помощью istream на той же строке, которую она объявила?

Можно ли сконденсировать следующие две строки в одну?

int foo;
std::cin >> foo;

Ответ 1

Ответ на умную задницу:

int old; std::cin >> old;

Ужасный ответ:

int old, dummy = (std::cin >> old, 0);

Правильный ответ: old должен быть определен с объявлением, прежде чем он может быть передан в operator>> в качестве аргумента. Единственный способ получить вызов функции в объявлении переменной - поместить ее в выражение инициализации, как указано выше. Принятый способ объявить переменную и прочитать ввод в нее, как вы написали:

int old;
std::cin >> old;

Ответ 2

Вы можете... с помощью

int old = (std::cin >> old, old);

но вы действительно не должны этого делать

Ответ 3

Использование функции:

int inputdata()
{
    int data;
    std::cin >> data;
    return data;
}

Тогда:

int a=inputdata();

Для самих данных:

int inputdata()
{
    static bool isDataDeclared=false;
    if (isDataDeclared==true)
    {
    goto read_data;
    }
    else
    {
        isDataDeclared=true;
    }
    static int data=inputdata();
    return data;
    read_data:
    std::cin >> data;
    return data;
}

Ответ 4

Возможно, не для int, а для ваших собственных типов:

class MyType {
    int value;
public:
    MyType(istream& is) {
        is >> *this;
    }

    friend istream& operator>>(istream& is, MyType& object);
};  

istream& operator>>(istream& is, MyType& object) {
    return is >> object.value;
}

Затем вы можете создать тип с istream, переданным конструктору:

int main() {
    istringstream iss("42");
    MyType object(iss);
}