Предупреждение компилятора при создании пользовательской реализации потока std - PullRequest
3 голосов
/ 03 августа 2011

У меня есть приложение Visual Studio 2008 C ++, в котором я создал пользовательский streambuf и реализацию потока.Я использовал подход, предложенный Angelika Langer для создания потока, подробно описанного ниже:

class MyOutputStream_3 : private MyStreamBuf, public ostream {
public:
    MyOutputStream_3() : ostream((MyStreamBuf*) this), ios(0) {};
    virtual ~MyOutputStream_3() { sync(); }
    // ...
}; 

Но Visual Studio выдает мне предупреждение :

warning C4355: 'this' : used in base member initializer list

Код работает нормально, но я беспокоюсь, что компилятор сообщает мне, что то, что я сделал, может либо сломаться при некоторых обстоятельствах, либо может быть непереносимым.

Это то, что яможно игнорировать в этом случае или что я должен сделать, чтобы исправить мою проблему?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Он предупреждает вас об использовании this в списке инициализатора, потому что технически, this еще не существует, потому что конструктор еще не завершил выполнение (и не имеет конструкторов каких-либо объектов-членов) и передает егофункция может вызвать проблемы, когда они пытаются использовать этот объект (который содержит объекты, конструкторы которых не были вызваны).

Код должен работать, если вы просто сохраняете указатель для использования позже.Но когда вы вернетесь к этому коду и забудете, что вы не должны использовать этот указатель, вы можете ошибиться и не сможете объяснить причину сбоя вашей программы.

Вот страница Microsoft дляэто предупреждение: http://msdn.microsoft.com/en-us/library/3c594ae3.aspx

1 голос
/ 03 августа 2011

Стандарт C ++ 03 содержит этот бит в примечании для 12.6.2 / 7 «Инициализация баз и элементов»:

[Примечание: поскольку mem-initializer оцениваются в области видимости конструктора, указатель this можно использовать в списке выражений mem-initializer для ссылки на инициализируемый объект. ]

Я думаю, что предупреждение выдается, потому что объект, на который указывает указатель this, не полностью инициализирован, поэтому существует некоторая потенциальная опасность. Пока ваша база на самом деле не использует неинициализированные части объекта до тех пор, пока они не будут инициализированы, все будет в порядке.

В качестве документов MSDN для предупреждения (http://msdn.microsoft.com/en-us/library/3c594ae3.aspx) упомянуть:

По сути, вы передали указатель на неструктурированный объект другому конструктору. Если эти другие конструкторы получат доступ к каким-либо членам или вызовут функции-члены, результат будет неопределенным.

0 голосов
/ 04 августа 2011

Кстати, это происходит только тогда, когда вы явно используете this в списке mem-initializer.Передача адреса переменной-члена, которая еще не была создана, не вызывает C4355.

Посмотрите на конструктор fstream, если вам нужны доказательства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...