Обоснование явного оператора преобразования функтораC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обоснование явного оператора преобразования функтора

Сообщение Anonymous »


Пока у меня был небольшой перерыв, мое рабочее место перешло на использование статического анализатора кода. Они проверили проект, над которым я работаю, и одна конкретная проблема, отмеченная анализатором, выглядит следующим образом (упрощенный пример):

struct CalcSomething { int результат; CalcSomething() : результат(0) {} void оператор()(const int v) { /*что-то делает*/ } оператор int() const {возвращает результат; } }; недействительный Фу() { std::vector myvector(10); // упражнение для читателя: вставляем несколько значений в `myvector` int result = std::for_each(myvector.begin(), myvector.end(),calcSomething()); } Анализатор отмечает следующие проблемы:

предупреждение: CodeChecker: оператор int должен быть помечен как явный, чтобы избежать непреднамеренных неявных преобразований [google-explicit-constructor] оператор int() const {возвращает результат; } Предлагаемое исправление функтора гласит:

struct CalcSomething { ... явный оператор int() const { возвращаемый результат; } }; Но если я исправлю свой функтор, как предложено, статический анализатор быстро обнаружит следующую проблему:

предупреждение: CodeChecker: невозможно выполнить преобразование из '(анонимное пространство имен)::calcSomething' в 'int' [clang-diagnostic-error] Теперь мне нужно добавить явное приведение типов:

void foo() { ... int total = static_cast(std::for_each(myvector.begin(), myvector.end(), CalcSomething())); } Приведенный выше пример представляет собой простое упрощение реальной проблемы, в противном случае просто добавлялся бы наполнитель, а не вещество.

Я видел множество примеров функторов, подобных тому, который я описываю здесь, в учебниках и на справочных веб-страницах по программированию. Я никогда не считал их небезопасными. Я никогда не видел, чтобы кто-нибудь отмечал их как небезопасные.

Так есть ли смысл в анализаторе кода? Или я немного переусердствовал, делая явным оператор преобразования моего функтора и в результате заставляя меня добавлять статическое приведение?

Чисто с эстетической точки зрения я считаю, что простая проблема с элегантным решением теперь имеет много уродливых синтаксических дополнений. Но, возможно, это цена, которую мы платим за написание безопасного(r) кода.

Примечание: TIL, который explicit применяется не только к векторам

Изменить

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

Если бы вопрос был о том, как улучшить алгоритм сложения, то в заголовке было бы об этом сказано.

Поэтому я решил скрыть все детали реализации в этом редактировании, чтобы облегчить работу этим людям.

Извините, что некоторые из комментариев ниже больше не имеют смысла, но запись застряла, поэтому мне пришлось немного сдвинуть иглу, чтобы продвинуться вперед (надеюсь).
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»