Здравствуйте, ssm, Вы писали:
ssm>Здравствуйте, MaximE, Вы писали:
ME>>Undefined behavior могло бы возникнуть, если бы я не определил деструктор у DataMapper. В этом случае компилятор сгенерировал бы деструктор по-умолчанию в каждом объектнике, пользующем DataMapper, что и было бы причиной undefined behavior.
ssm>открываем стандарт и смотрим пункт 17.4.3.6, а именно последнюю часть:
ssm>In particular, the effects are undefined in the following cases:
ssm>-if an incomplete type(3.9) is used as template argument when instanting a template component
ssm>что и имеет место в приведенном тобой коде
Это так. Но пользователем этой структуры является
только DataMapper. В *.cpp DataMapperImpl полностью определен и вызов ~auto_ptr<DataMapperImpl> происходит только из
определенного деструктора DataMapper, что не приводит к неопределенному поведению.
Это тоже самое, как если бы я написал так:
class DataMapper : public Reference
{
public:
DataMapper();
~DataMapper();
private:
//const std::auto_ptr<struct DataMapperImpl> _pimpl;
struct DataMapperImpl* _pimpl;
};
///////////////////////////////////////////////////////////////////////////////
struct DataMapperImpl
{
DataMapperImpl() : _connection(__uuidof(Connection))
{
_connection->Open(sqlConnection, _bstr_t(), _bstr_t(), adConnectUnspecified);
};
_ConnectionPtr _connection;
};
///////////////////////////////////////////////////////////////////////////////
DataMapper::DataMapper()
: _pimpl(new DataMapperImpl)
{
}
///////////////////////////////////////////////////////////////////////////////
DataMapper::~DataMapper()
{
delete _pimpl;
}
Рекоммендую, все-таки, почитать Саттера по вышеприведенной ссылке