У меня есть следующий пример класса, упрощенный из более крупного проекта. Он основан на структуре ведения журнала, которая использует область действия средства ведения журнала для завершения записи журнала в деструкторе.
Приведенный ниже код не будет компилироваться, поскольку конструктор представляет собой неявно удаленную функцию (edit: not true), которая, похоже, имеет какое-то отношение к объекту std::ostringstream
. Я запутался в этом, потому что я думаю, что должен иметь возможность напрямую построить std::ostringstream
, что означало бы, что я должен иметь возможность напрямую построить объект Container
.
#include <iostream>
#include <sstream>
class Container {
public:
std::ostringstream bufferStream;
public:
Container(); // constructor
~Container();
};
Container::Container() {
bufferStream << "Hello ";
}
Container::~Container() {
std::cout << bufferStream.str() << " [end]" << std::endl;
}
// === Main method ===
int main() {
Container().bufferStream << "world"; // works fine
{ // causes tons of compiler errors
Container cont = Container();
cont.bufferStream << "world!";
}
return 0;
}
Обратите внимание, что строка с надписью «отлично работает» делает именно это. Кажется, создается экземпляр анонимного объекта Container
, который содержит новый std::ostringstream
, к которому можно получить прямой доступ для вывода «мир». Сам Container
создает часть сообщения "Hello", а его деструктор очищает буфер.
Почему вторая часть, в которой объект Container
именуется и сохраняется, работает некорректно? Вот пример ошибок, которые я получаю:
error.cpp: In function ‘int main()’:
error.cpp:28:36: error: use of deleted function ‘Container::Container(const Container&)’
Container cont = Container();
^
error.cpp:4:7: note: ‘Container::Container(const Container&)’ is implicitly deleted because the default definition would be ill-formed:
class Container {
^
error.cpp:4:7: error: use of deleted function ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’
In file included from error.cpp:2:0:
/usr/include/c++/4.8/sstream:387:11: note: ‘std::basic_ostringstream<char>::basic_ostringstream(const std::basic_ostringstream<char>&)’ is implicitly deleted because the default definition would be ill-formed:
class basic_ostringstream : public basic_ostream<_CharT, _Traits>
... и так далее.