Проблема с boolean-ом в C++

127
22 апреля 2022, 11:40
static bool wheel_scrolled_up(SDL_Event event);

Почему этот boolean может запуститься без SDL_Event event, когда должен только с SDL_Event event?

Пример:

#include <AceEngine/AceEngine.hpp>
#include <iostream>
using namespace std;
SDL_Event event;
int main()
{
    if (ACE::mouse::wheel_scrolled_up/* (SDL_Event event) */)
        cout << "Wheel scrolled up!" << endl;
}

Этот код не выдаёт при компиляций никаких ощибок, когда он должен выдовать!

По настоящему должно быть так:

#include <AceEngine/AceEngine.hpp>
#include <iostream>
using namespace std;
SDL_Event event;
int main()
{
    if (ACE::mouse::wheel_scrolled_up(event))
        cout << "Wheel scrolled up!" << endl;
}

Я не знаю это баг или нет, но так не должно быть!

Как сделать так чтобы без SDL_Event event компилятор выдовал ощибку?

Answer 1

Этот код формально валиден и не должен генерировать ошибку. Имя ACE::mouse::wheel_scrolled_up без скобочек может рассматриваться как указатель на функцию и внутри if преобразуется в bool. Хотя такая запись валидна, она не не имеет большого смысла, так как результат такого преобразования известен на этапе компиляции, что делает if фактически бессмысленным. Во многих компиляторах есть соотв. предупреждение на такой случай (warning C4551, -Wpointer-bool-conversion), которое имеет смысл включить и (опционально) перевести в категорию ошибок.

void foo(int) {}
int main()
{
    if (foo) // error: address of function 'foo' will always evaluate to 'true' [-Werror,-Wpointer-bool-conversion]
    {
        return 1;
    }
    return 0;
}

https://godbolt.org/z/Pv44dW

Answer 2

ACE::mouse::wheel_scrolled_up - это не вызов, а по сути адрес функции, каковой явно не nullptr, а значит, вы написали if (true) ... (при приведении адреса в bool).

Вызов всегда требует наличия скобок! То, что вы считаете "вызовом без event", имело бы вид

ACE::mouse::wheel_scrolled_up()
READ ALSO
c++ программирование

c++ программирование

С двумерным массивом, состоящим из n вещественных элементов, выполнить следующее: преобразовать массив, удалив из него одинаковые элементыОсвободившиеся...

132
Почему в тип данных из двух бит я не могу записать нужное мне число?

Почему в тип данных из двух бит я не могу записать нужное мне число?

Есть структура, которая хранит чимсло из 2 бит, все верно же?

92
Vulkan API не возвращает расширения и слои валидации

Vulkan API не возвращает расширения и слои валидации

При попытке получения свойств слоёв валидации и расширений в вектора типа VkLayerProperties и VkExtensionProperties, функции VkEnumerateInstanceLayerProperties и VkEnumerateInstanceExtensionProperties...

101
Как сделать метод const и неconst одновременно? [закрыт]

Как сделать метод const и неconst одновременно? [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

118