boost :: bind нарушает правила строгого псевдонима?

Используя Boost 1.43 и GCC 4.4.3, следующий код

boost::bind(&SomeObject::memberFunc, this, _1));

Создает следующее предупреждение

boost / function / function_base.hpp: 321: предупреждение: разыменование указателя с типом каламбура нарушит правила строгого алиасинга

Как правильно убрать эти предупреждения без установки -fno-strict-aliasing?


person Kyle    schedule 15.06.2010    source источник
comment
Boost не предназначен и не предназначен для выдачи предупреждений на всех компиляторах. По всей видимости, это побочный эффект использования boost :: bind. В любом случае прирост производительности -fno-strict-aliasing незначителен.   -  person Billy ONeal    schedule 15.06.2010


Ответы (2)


Вы уверены, что у вас есть правильный объект, соответствующий классу, в котором находится функция-член foo? Другими словами, в опубликованном вами коде тип * this такой же, как SomeObject? Псевдоним возникает, когда компилятор должен отслеживать несколько указателей разных типов на одни и те же необработанные данные, поэтому я подозреваю, что типы * this и SomeObject не совпадают.

person sashang    schedule 15.06.2010
comment
вы единственный ответ .. поздравляю, вы выиграли. (хотя типы * this и SomeObject совпадают.) - person Kyle; 20.06.2010
comment
@ Кайл ... Это не то, как работает принятие ответа. Особенно, когда (A) этот ответ, вероятно, должен был быть просто комментарием, (B) он игнорирует тот факт, что bind почти наверняка использует template сопоставление аргументов, чтобы в любом случае потребовать совместимые (псевдонимы) аргументы указателя на метод и указатель на экземпляр, это означает, что проблема может заключаться в ошибке во внутреннем устройстве функции, и (C) вы открыто признаете, что это не решает проблему, поставленную в вашем вопросе. Так что не помечайте это как ответ! Другой ответ здесь действительно объясняет это. - person underscore_d; 27.08.2016

Для записи у меня было такое же предупреждение для boost :: bind с использованием GCC 4.4.3 для собственного клиента Google. Предупреждение исчезло после обновления буста с версии 1.41.0 до 1.47.0.

person Sigmund    schedule 19.09.2011