Pull to refresh
24
0
Send message
Всегда удивляло такое отношение к собеседнику.
Если вы знаете больше, напишите что именно неправильно. Зачем начинать обсуждать качества личности человека, делать какие-то вывод на его счет?
Кстати, очень интересно было бы посмотреть на вашу реализацию common_type.

Могу сказать, что в моем случае — это как раз один из тех примеров, когда пришлось делать условную компиляцию. Для GCC 2.х реализация оказалась настолько нетривиальна, что брать ее как основную мне не позволила совесть.
Сама статья про другое, но написана она была по мотивам создания практически такого же набора инструментов, как у вас. Платформа только различается и целевые компиляторы.
Вы не подумайте, мне очень близка ваша идея строгого соответствия «букве» закона. Но я, как практик, при столкновении с подобными трудностями в своей реализации, делая выбор между «поддерживать фичу с оговорками» или «не поддерживать вовсе» выбираю первое :)

Взять, например, задачу определения наличия функции-члена класса с заданной сигнатурой, которая нерешаема в рамках стандартного С++98. Однако, эта возможность была необходима в инструментарии, который я создавал. Без нее было бы слишком неудобно им пользоваться. Поэтому я пошел на этот компромисс.

Также приходилось сталкиваться в ситуацией, когда невозможно написать общий код для всей линейки нужных компиляторов, и таки приходилось делать условную компиляцию. Т.к. баги-фичи одних компиляторов были взаимоисключающими относительно других. Общий знаменатель был невозможен.
Таки шашечки или ехать? :)
В бусте тоже встречаются workaround`ы с нестандартными особенностями, обложенные проверками под конкретные компиляторы.
Ведь если мы работаем в условиях такой плохой поддержки стандарта, то сетовать на несоответствие стандарту некоторым образом лукавство, особенно, если код обеспечивает требуемое поведение.
Поэтому тут надо выбирать что важнее.

PS. Да, и я в курсе этих особенностей, т.к. сам некоторым образом решал подобную вашей задачу (пример: habr.com/post/277727), но для линейки старых GCC и Intel под Linux и BSD. Попробуйте вашу реализацию на GCC 2.x, возможно найдется множество интересных локальных задачек по нахождению обходных путей.
Борландовские версии к сожалению не работают, сегодня проверил :) Я долго пытался состряпать workaround, но похоже пациент совсем плохо умеет SFINAE — ничего не вышло.
Если автору важно поддерживать Borland C++, то вполне понятно почему он не применил это решение.
… проблема возникает с неполным типом T[] (массив без указания длины). Дело в том что данный тип не определяется некоторыми компиляторами (C++ Builder) при специализации шаблона, и универсальное решение здесь я пока что не нашел.

Проверил код ниже на C++ Builder 6 — работает.

namespace detail {

    template <typename T>
    static yes_type foo(T (*)[]);
    static no_type  foo(...);
    
    template <typename T>
    static T * declptr();
}

// is_array
template <class Tp>
struct is_array
{ 
    enum 
    { 
        value = sizeof(detail::foo(detail::declptr<Tp>())) == sizeof(yes_type) 
    }; 
};

template <class Tp, std::size_t Size>
struct is_array<Tp[Size]> 
    : true_type 
{ };
Мы использовали ICE.
zeroc.com/products/ice
Нет, тут дело не в этом.
Проблема производительности в том, что если у нас есть переменная val целого типа, то компилятор в выражении
bool f = val;

может сгенерировать (внимание, ниже псевдокод для демонстрации поведения) нечто вроде такого:
bool f = val == 0 ? false : true;

Это предупреждение было призвано обозначить возможность потенциальной генерации такого кода в этом месте, на случай, если программист об этом не подумал.
Чтобы не быть голословным, приведу практический пример с дизассемблером:
godbolt.org/g/FQG8Jk
Как видим, в безобидном присваивании появилось условие. Данный warning об этом.

При этом, если посмотреть выданную выше ссылку, то можно увидеть в ответе на report такие слова
My understanding of the history of C4800 was that it was introduced a very long time ago (~1990?) to address concerns for developers migrating from C.
Это коссвенно указывает на тоже самое, о чем я говорил выше. Т.к. в С не было типа bool, то программисты на нем, при переходе на С++ могли быть неприятно удивлены, что одинаковый внешне код в С++ приводит к генерации «лишних» инструкций, чего в С не наблюдалось. Поэтому на каких-то этапах это предупреждение действительно было полезно.
А вот у меня вопрос.
А почему из перевода книги убрали 4 главы про System V?
Функции с cv-seq (мерзкие типы) — это больная тема. Несколько лет назад в своей статье как раз затрагивал проблемы, связанные с интерпретацией таких типов компиляторами. :)
Ссылка к слову пришлась


В книге «Шаблоны С++. Справочник разработчика», есть целый раздел, посвященный оптимизации таких выражений, для исключения создания «лишних» временных объектов. Описанный подход немного потерял актуальность с выходом новых стандартов, но для понимания сути очень полезно почитать, я думаю. Чтобы не слепо верить и не никогда использовать, а разобраться и делать осознанный выбор.
Присоединяюсь.
Года полтора назад писал к Вам в редакцию электронное письмо по этой теме, но никакого ответа, даже формального, к сожалению не дождался.
В числе прочих, очень бы хотелось снова увидеть на прилавках книги Р. Стивенса по сетевому программированию.
В MS имеют другую точку зрения на этот вопрос: их реализация просто игнорирует const в тех контекстах, где он недопустим.
Это следует и из ответа, который мне дали в багтрекере, и в принципе согласуется с практическими экспериментами ув. thedsi666 c VS.
Я о другом. Смысл искажается. Хотя конечно дело ваше.
Но хотя бы вставить пояснение того, что на самом деле означает слово "персональная" в этом контексте. А то ведь смысл этого слова в русском языке совсем не сочетается с тем, что имелось в виду в английском варианте.
По поводу "персональной функции".

Приведу цитату из LLVM manual:

Because different programming languages have different behaviors when handling exceptions, the exception handling ABI provides a mechanism for supplying personalities. An exception handling personality is defined by way of a personality function (e.g. __gxx_personality_v0 in C++), which receives the context of the exception, an exception structure containing the exception object type and value, and a reference to the exception table for the current function. The personality function for the current compile unit is specified in a common exception frame.

Исходя из этой цитаты, на мой взгляд, personality function не может переводиться как "персональная функция", а скорее как "функция, отражающая особенности [конкретного механизма исключений]". Но данный перевод теряет лаконичность оригинальной фразы. Поэтому возможно лучше оставить это словосочетание без перевода (например со сноской на детальное объяснение того, что это значит), так же, как вы поступили с landing pads.
Ну не без этого, но это не главная причина.
У нас много legacy, при чем это касается не только софта, но и всяких бюрократических моментов.
Спасибо, прикрепил файлики.
Не совсем. Но версия компилятора у нас приколочена очень крепко (самый новый из доступных — GCC 4.1.3).
Спасибо — это очень интересно.
Может быть стоит добавить эту информацию в багрепорт?
Спасибо за отзыв.
К сожалению, в моем случае перспектива перехода на С++11 на работе кажется фантастической :)

Information

Rating
Does not participate
Location
Россия
Registered
Activity