Предыстория:
string s = "hello, world!";
Почему такое компилируется:
stringstream ss(s);
А такое нет:
stringstream ss = s;
Ведь по идее должен вызываться один и тот же конструктор?
Здравствуйте, Аноним, Вы писали:
А>А такое нет:
А>А>stringstream ss = s;
А>
Этот код эквивалентен следующему:
stringstream ss (stringstream(s));
Т.е. что бы такой код компилировался, дополнительно должен быть доступен конструктор копирования.
Этот код:
stringstream ss (s);
не требует наличия открытого конструктора копирования.
Здравствуйте, Аноним, Вы писали:
А>Почему такое компилируется:
А>А>stringstream ss(s);
А>
А>А такое нет:
А>А>stringstream ss = s;
А>
А>Ведь по идее должен вызываться один и тот же конструктор?
Потому что конструктор может быть объявлен как explicit во избежание неявного преобразования.
Здравствуйте, Аноним, Вы писали:
А>Предыстория:
А>А>string s = "hello, world!";
А>
А>Почему такое компилируется:
А>А>stringstream ss(s);
А>
А>А такое нет:
А>А>stringstream ss = s;
А>
А>Ведь по идее должен вызываться один и тот же конструктор?
Первый вариант — прямая инициализация.
Второй — инициализация копированием. В данном случае должен быть доступен конструктор копированиея, даже если он реально и не используется. За подробностями можно обратиться в поиск — это обсуждалось уже не раз.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Bell, Вы писали:
B>>Второй — инициализация копированием. В данном случае должен быть доступен конструктор копированиея, даже если он реально и не используется.
А>И при передаче в качестве параметре функции используется эта "инициализация копированием"?
Да — смотри 8.5/12
А>А нафига закрыли конструктор копирования у stringstream'а?
А как должны копироваться потоки?
B>>За подробностями можно обратиться в поиск — это обсуждалось уже не раз.
А>Поиск не работает или работает фигово.
Ну есть еще и гугль