Невозможно назначить INVALID_HANDLE_VALUE для constexpr HANDLE при создании определений типов для Winapi

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

#pragma once
#ifdef _WIN32
#include "windows.h"

namespace RawHttp
{
namespace Win
{

using Bool = BOOL;
using Handle = HANDLE;
using Dword = DWORD;
constexpr const Handle Null = NULL;
constexpr const Handle InvalidHandle = static_cast<Handle>(INVALID_HANDLE_VALUE);
}
}
#else
namespace RawHttp
{
namespace Win
{

using Bool = bool;
using Handle = void *;
using Dword = unsigned long;
constexpr const Handle Null = nullptr;
constexpr const Handle InvalidHandle = (Handle)(long long)-1;
}
}
#endif //_WIN32

Если он включен в файл C++, он не скомпилируется в Visual Studio:

windows\windowstypes.h(14): error C2131: expression did not evaluate to a constant
windows\windowstypes.h(14): note: failure was caused by unevaluable pointer value

В G++ компилируется нормально. Что вообще означает эта ошибка?

Как правильно преобразовать INVALID_HANDLE_VALUE окна в constexpr void* и как сделать то же самое в не-оконной ветке кода выше?

Моя версия Visual Studio — 15.9.18.


person Tomáš Zato - Reinstate Monica    schedule 23.05.2021    source источник
comment
Вам не нужно вводить приведение INVALID_HANDLE_VALUE, оно уже введено как HANDLE.   -  person Remy Lebeau    schedule 23.05.2021
comment
@RemyLebeau Я тоже так думаю, я добавил актерский состав только после того, как появилась ошибка, надеясь, что это исправит ее.   -  person Tomáš Zato - Reinstate Monica    schedule 23.05.2021
comment
Кстати, (long long)-1 вместо этого можно записать как -1LL.   -  person Remy Lebeau    schedule 23.05.2021
comment
TL;ДР; из дубликата: g++ неверен, MSVC (и clang) правы: вы не можете reinterpret_cast (или приведение в стиле C) к типу указателя constexpr.   -  person Adrian Mole    schedule 24.05.2021
comment
@AdrianMole Итак, почему статическое приведение также не работает? И вообще, как заставить код работать как для оконной, так и для не оконной ветки? Я получаю одну и ту же ошибку в обоих случаях, чего и следовало ожидать в соответствии со связанным QA. Так какой там правильный подход?   -  person Tomáš Zato - Reinstate Monica    schedule 24.05.2021
comment
Статическое приведение не выполняется, поскольку определение макроса INVALID_HANDLE_VALUE уже включает приведение в стиле C. Но и без этого он также потерпит неудачу, потому что вы не можете статически привести (ненулевой) целочисленный литерал к указателю. Как это обойти - вопрос более сложный.   -  person Adrian Mole    schedule 24.05.2021
comment
Один из вариантов — просто удалить constexpr и оставить InvalidHandle как (статический) const.   -  person Adrian Mole    schedule 24.05.2021