LINUX.ORG.RU

C++: как написать числовой литерал нуль, как int

 


0

3

Вопрос может показаться очень странным…

Использую библиотеку google test, применяю их шаблонную функцию ASSERT_EQ(). Упрощенный пример:

const int Zero = 0;
ASSERT_EQ(0, Zero);

Анализатор кода ворчит на нуль в функции, пишет: «zero as null pointer constant».

Как в коде указать, что нуль - это именно число в формате int?

★★
Ответ на: комментарий от Begemoth

Спасибо, работает. Магия инициализации С++11)

neon1ks ★★
() автор топика

Анализатор кода ворчит на нуль в функции, пишет: «zero as null pointer constant».
Как в коде указать, что нуль - это именно число в формате int?

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

anonymous
()
Ответ на: комментарий от anonymous

что за анализатор?

Используются clang-Tidy и clazy.

Проблема не в нуле. Проблема в том, что выбирается функция с аргументом-указаетелем.

Дело в том, что литерал 0 имеет две трактовки: числовое значение 0 и нулевой указатель. Шаблонная функция может то и другое принимать. В коде нет ошибки, анализатор тот ещё паникер =)

neon1ks ★★
() автор топика
Ответ на: комментарий от neon1ks

В коде нет ошибки, анализатор тот ещё паникер

… либо есть неоднозначность, из-за чего (анализатор думает, что) выбирается специализация с указателем. Что может в последующем стать причиной ошибки. Не будешь же в реальном коде писать такие конструкции int{0}.

Нужен минимальный код, воспроизводящий ошибку.

anonymous
()

Может просто ASSERT_EQ(Zero, 0)? Не уподобляйся мудакам которые при сравнении пишут константу в начале.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Может просто ASSERT_EQ(Zero, 0)?

Кстати, да. Если поменять местами, то предупреждение не появляется.

neon1ks ★★
() автор топика
Ответ на: комментарий от slovazap

Не уподобляйся мудакам которые при сравнении пишут константу в начале.

Только gtest ожидает что первым аргументом будет «expected», а вторым – «actual». Если переставить константу взад, то вывод будет не совсем логичным.

KennyMinigun ★★★★★
()

Как в коде указать, что нуль - это именно число в формате int?

Открыть стандарт. 0 это int prvalue.

anonymous
()
Ответ на: комментарий от anonymous

Открыть стандарт. 0 это int prvalue.

И там нету того, что 0 также может быть нулевым указателем?

neon1ks ★★
() автор топика

Кому интересно, можете посмотреть код.

neon1ks/neuro

neon1ks/neuro-tests

В тестах можете найти места, где я использую int(0) или int{0}, если там заменить на 0 - появляется предупреждение «zero as null pointer constant».

Сейчас у меня есть три решения:

  1. Завести константу const int Zero = 0 и её использовать, когда нужен 0;
  2. Писать в коде int{0}
  3. Ну и не передавать 0 в качестве первого аргумента.

Но у меня есть чувство, что здесь должно быть более элегантное решение…

neon1ks ★★
() автор топика
Ответ на: комментарий от anonymous

А вот и не совсем так.

В C++98 литерал 0 имеет две трактовки: числовое значение и нулевой указатель. В C++11 введено – ключевое слово nullptr, которое означает нулевой указатель. Но несмотря на это, использование 0, как нулевого указателя, оставили для обратной совместимости.

neon1ks ★★
() автор топика
Последнее исправление: neon1ks (всего исправлений: 1)
Ответ на: комментарий от neon1ks

int{0}

int{}

что здесь должно быть более элегантное решение…

У тебя явная шизофрения. Там написано, что ты ноль используешься как указатель. Т.е. ты либо в своём говноассерте сравниваешь указатель с нулём, либо это какое-то говно в твоих либах.

anonymous
()
Ответ на: комментарий от neon1ks

В C++98 литерал 0 имеет две трактовки: числовое значение и нулевой указатель.

Ну покажи, как ты применяешь, например, унарный оператор * к 0.

anonymous
()
Ответ на: комментарий от neon1ks

Но у меня есть чувство, что здесь должно быть более элегантное решение…

1-1, +0, -0.

anonymous
()
Ответ на: комментарий от anonymous

Не будешь же в реальном коде писать такие конструкции int{0}.

Вам шашечки или ехать? Синтаксис C++ ужасен, так что хуже от пары фигурных скобочек и int не станет.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Синтаксис C++ ужасен

Примеры нормального синтаксиса в студию.

Вспомнилось:

<@joosa> how do you say float in java? just 1.5f?

<@Gliptic>

FloatFactoryFactory.getInstance(FloatFactoryFactory.defaultInstanceDescriptionString).getFactory(Locale.getLocale("en-US")).createBuilder().setString("1.5").getResult()

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от peregrine

Те же яйца, что джава, только сбоку. Меня как-то попытались из крестовой команды, которая занималась LLVM, перевести в виндовую на C#, ну я писать-то на нём смог (после прочтения статьи «Learn C# in 10 minutes for C++ coders»), но постоянно тянуло блевать, кароче я и двух месяцев там не протянул, сказал, что либо забирайте обратно на кресты, либо я увольняюсь. Ну забрали к крестовикам обратно.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от peregrine

C# - на 70% состоит из С++-базы, на 15% из чего-то адекватного и на 15% из мусора. Никакого альтернативного синтаксиса там нету. Вообще.

anonymous
()
Ответ на: комментарий от peregrine

Вам шашечки или ехать? Синтаксис C++ ужасен, так что хуже от пары фигурных скобочек и int не станет.

Как же ты обгадился, клоун. int{} - это аналог new int(0) - из всяких жаб/шарпов. Хотя в шарпе вроде как есть подобный синтаксис.

anonymous
()
Ответ на: комментарий от anonymous

Ну там поощряется Java-like многословность, типа как я выше привёл щютку про FloatFactoryFactory.defaultInstanceDescriptionString.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

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

А то, что там такой стиль именования - ну то просто проблема ЦА. В основном там работают не особо одарённые люди и думать о чём-то им крайне сложно.

Допустим, нормальному человеку и так понятно из String Description то, что Description - это String. Но таких людей там мало.

anonymous
()
Ответ на: комментарий от neon1ks

Нет! Это разные вещи!

Ты пытаешься мне что-то рассказать? Ну давай, я жду объяснений. На каком основании нет и почему это разные вещи.

anonymous
()
Ответ на: комментарий от anonymous

Ну как я понял, тебя int{} - вызывает конструктор int() в котором есть операция new(). Допустим это, раз есть конструктор, то есть и деструктор, в котором есть и delete.

А вот, когда используешь new int(0), надо самому вызывать delete.

Тем самым сама необходимость дополнительного вызова delete, говорит о том, что int{} - это не аналог new int(0)

int{} - не приводит к утечке памяти. А new int(0) без delete приводит.

neon1ks ★★
() автор топика
Последнее исправление: neon1ks (всего исправлений: 3)
Ответ на: комментарий от neon1ks

int{} - вызывает конструктор int() в котором есть операция new(). Допустим это, раз есть конструктор, то есть и деструктор, в котором есть и delete.

Нет, ты бред какой-то написал. Расписывать лень, вот почитай, например: http://www.informit.com/articles/article.aspx?p=1852519

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от neon1ks

Ну как я понял, тебя int{}

int{} - это дефолтный инициализатор инстанса int. Либо дефолтный конструктор. Это неважно.

операция new(). Допустим это, раз есть конструктор, то есть и деструктор, в котором есть и delete.

Операций new(), которая оператор new - это аллокатор, как и оператор delete - это деаллокатор. Никак и ни с чем это не связано.

new - это просто оператор, который создаёт объект в каком-то стородже. Либо выделенным оператор new() - это поведение по умолчанию, либо в явно указанном через new(ptr)

Вообщем, всё это написано в букваре.

А вот, когда используешь new int(0), надо самому вызывать delete.

Вот ты мне объясни - ты совсем поехавший? Какой ещё, нахрен, delete в C#? Авось ты читать не умеешь и не понял, но я сравниваю int{} и конструкцию из шарпа. Никто тебе не говорил про new из С++.

Тем самым сама необходимость дополнительного вызова delete, говорит о том, что int{} - это не аналог new int(0)

Вообщем, читай и букварь и то, что я пишу. А уже после отвечай.

anonymous
()
Ответ на: комментарий от anonymous

Вот ты мне объясни - ты совсем поехавший? Какой ещё, нахрен, delete в C#? Авось ты читать не умеешь и не понял, но я сравниваю int{} и конструкцию из шарпа. Никто тебе не говорил про new из С++.

Хорошо, я пишу про C++.

neon1ks ★★
() автор топика
Ответ на: комментарий от neon1ks

Да мне то какая разница о чём ты там пишешь? Дошколёнок мне писал про «плохой синтаксис в С++» и ему дал сравнение с шарпом, о котором он(или кто там) кукарекал.

anonymous
()
Ответ на: комментарий от neon1ks

В C++98 литерал 0 имеет две трактовки

У литерала не может быть два типа, как и у любого другого выражения. Просто есть неявное преобразование его к указателю.

anonymous
()
Ответ на: комментарий от anonymous

Ты не дал сравнение синтаксиса с шарпом. Ты дал одну конструкцию языка. C++ не из-за неё уродлив, а из-за кучи легаси, которое тащат из времён царя гороха для обратной совместимости.

peregrine ★★★★★
()
Ответ на: комментарий от DELIRIUM

Нет, ты бред какой-то написал.

Там и правда был бред.

neon1ks ★★
() автор топика
Ответ на: комментарий от peregrine

Банки и Bigdata смотрят на вас с изумлением.

Да у нас тут домохозяйка в эксперты записалась.

Bigdata

Это маркетинговый булшит.

Банки

Это враньё и легаси-говно. Очевидно, что никто не-легаси говно на жаве не пишет, даже в полулегаси жаба-мире. Ну если это только совсем не птушники, но это опять же легаси.

anonymous
()
Ответ на: комментарий от peregrine

Ты не дал сравнение синтаксиса с шарпом.

Ты кукарекал про int{} - я дал аналог на шарпе/жаве - ты обгадился.

Ты дал одну конструкцию языка.

Ну дак ты же про неё кукарекал. Назови мне другую конструкцию - будет всё тоже самое.

C++ не из-за неё уродлив, а из-за кучи легаси

Полная херня. называй примеры.

которое тащат из времён царя гороха для обратной совместимости.

Ещё одна херня нелепая. К тому же, жаба/C# точно так же блюдут обратную совместимость в мере не особо меньшей, чем С++. Особенно жава.

anonymous
()

Заведи ещё один макрос/функцию ASSERT_ZERO с одним параметром, внутри которой вызывай ASSERT_EQ. Делов-то. Прям как маленький.

Если такого макроса в GTest ещё нет.

anonymous
()
Ответ на: комментарий от neon1ks

Ну как я понял, тебя int{} - вызывает конструктор int()

У int нет конструктора или деструктора.

anonymous
()
Ответ на: комментарий от anonymous

У int нет конструктора или деструктора.

Конечно нету.

neon1ks ★★
() автор топика
Ответ на: комментарий от KennyMinigun

Тогда не использовать весь фреймворк написанный означенными мудаками.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.