2013-10-15 4 views
3

Следующий код не в GCC, Clang и Visual Studio:Почему я не могу скопировать инициализацию строкового потока из строки?

#include <string> 
#include <sstream> 

int main() { 
    std::string s = "hello"; // ok, copy-initialization 
    std::stringstream ss1(s); // ok, direct-initialization 
    std::stringstream ss2 = s; // error 
} 

Я думал, что единственный случай, когда работает прямая инициализация во время копирования инициализации не есть, когда конструктор явно, что он не Это дело. Что происходит?

+1

Codepad пример: http://codepad.org/du90Fkck –

+0

Я запутался с вами почему» re пытается установить std :: stringstream в строку. Для этого нет оператора присваивания по умолчанию. Взгляните [здесь] (http://www.cplusplus.com/reference/sstream/stringstream/operator=/). – Dan

+1

@ Дан, это инициализация, а не назначение. – jrok

ответ

5

Этот конструктор - это, обозначенный как явный, поэтому его можно использовать только с прямой инициализацией. §27.8.5:

explicit basic_stringstream(
ios_base::openmode which = ios_base::out | ios_base::in); 

explicit basic_stringstream(
const basic_string<charT,traits,Allocator>& str, 
ios_base::openmode which = ios_base::out | ios_base::in); 

basic_stringstream(const basic_stringstream& rhs) = delete; 

basic_stringstream(basic_stringstream&& rhs); 

(. То же самое верно и для basic_stringbuf, basic_istringstream и basic_ostringstream)

+0

Но это stringbuf, а не stringstream. – Nikolai

+0

@Nikolai: Упс, хороший глаз. По меньшей мере, 5 других людей тоже это пропустили. :) Обновленный текст, это тот случай, когда конструктор явный для всех связанных с потоком строк типов. – GManNickG

+0

Я вижу, произошла ошибка на cppreference.com. Я исправил это. – Nikolai

Смежные вопросы