Enum Scoped не вызывает ошибку компилятора при передаче в MAKEWPARAM. Почему? - PullRequest
0 голосов
/ 19 апреля 2020

Можете ли вы объяснить это тогда для меня?

У нас есть это определение enum:

enum class MenuNavigation : int {
    File,
    Edit,
    View,
    Options,
    Help
};

В моем коде у меня есть места, где это делается:

theApp.UpdateMenuBitmap(m_mapMenuBitmap, 
                        pView, 
                        MAKEWPARAM(MenuNavigation::View,5), IDB_BMP_MENU_ZOOM, true);

Ключевой бит этого кода:

MAKEWPARAM(MenuNavigation::View,5)

Я не получаю ошибок усложнения для этого. Мы знаем, что MAKEWPARAM определяется как:

#define MAKEWPARAM(l, h)      ((WPARAM)(DWORD)MAKELONG(l, h))

Теперь я знаю, что могу изменить свой код следующим образом:

MAKEWPARAM(to_underlying(MenuNavigation::View),5)

Где to_underlying определяется как:

template <typename E>
constexpr auto to_underlying(E e) noexcept
{
    return static_cast<std::underlying_type_t<E>>(e);
}

Но почему компилятор не жаловался на необходимость приведения типа * stati c в первом экземпляре?

Update

MAKELONG определяется как:

#define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))

1 Ответ

4 голосов
/ 19 апреля 2020

Это потому, что вы делаете cast в первом случае. Когда вы делаете

(type)value

, вы делаете static_cast.

Фактически, использование 1033 * -тист-типа означает, что компилятор попытается выполнить

  1. const_cast
  2. static_cast,
  3. static_cast + const_cast
  4. reinterpret_cast
  5. reinterpret_cast + const_cast

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

...