Я пытаюсь обход ошибки в MSVC 2015, с которой я столкнулся (см. Этот вопрос: wrong type deduction of function signature).Использование функции статического constexpr-члена, возвращающей автоматический внутренний класс
Так что я пришел с этим:
#include<Windows.h>
namespace wreg {
using t_oshandle = HKEY;
struct t_api
{
static constexpr
auto fnc_open_key() { return ::RegOpenKeyExA; }
//this doesn't compile :
static constexpr auto open_key = fnc_open_key();
//these don't compile either:
//static constexpr decltype(fnc_open_key()) open_key = fnc_open_key();
//static constexpr decltype(::RegOpenKeyExA) open_key = fnc_open_key();
};
//this does compiles and runs :
constexpr auto open_key = t_api::fnc_open_key();
} // namespace wreg
//int main(int argc ,_TCHAR* argv[]);
{
auto hk = wreg::t_oshandle{};
auto res = wreg::t_api::open_key(HKEY_LOCAL_MACHINE ,"SOFTWARE" ,0 ,KEY_READ ,&hk);
//auto res = wreg::open_key(HKEY_LOCAL_MACHINE ,"SOFTWARE" ,0 ,KEY_READ ,&hk);
if (res == ERROR_SUCCESS)
{
res = ::RegCloseKey(hk);
}
return 0;
}
но он не компилируется из-за
ошибка C3779: 'WREG :: t_api :: fnc_open_key': функция, которая возвращает «автоматический 'не может использоваться до его определения
Не понимаю. Он четко определен в той точке, в которой я его использую. И кроме того, в пределах класса обычно имена, локальные для определения класса, могут использоваться до его определения/объявления.
Вопрос: Почему MSVC правильно или должен компилироваться мой код?
static constexpr auto fnc_open_key() {return :: RegOpenKeyExA; } <- синтаксис вызова функции. Где скобки? Это не может быть тогда выведено к тому, что вы хотите. – AlexanderVX
это не вызов функции, он возвращает указатель на функцию –
Затем auto *, указатель? – AlexanderVX