Рассмотрим следующее
struct dummy{};
dummy d1;
dummy d2;
template<dummy* dum>
void foo()
{
if (dum == &d1)
; // do something
else if (dum == &d2)
; // do something else
}
Теперь можно вызвать foo
следующим образом
foo<&d1>();
foo<&d2>();
и все работает так, как ожидалось. Но следующее не
constexpr dummy* dum_ptr = &d1;
foo<dum_ptr>();
С этой ошибкой в Visual Studio
ошибка C2975:
dum_ptr
: неверный аргумент шаблона дляfoo
, ожидаемое выражение константы времени компиляции
Пока это работает
constexpr dummy& dum_ref = d1;
foo<&dum_ptr>();
В визуальной студии, но не в g++, из-за
Примечание: сбой аргумента шаблона/замена:
error:& dum_ref
не является допустимым аргументом шаблона дляdummy*
, потому что это не адрес переменнойfoo<&dum_ref>();
EDIT:
Поскольку С++ 17, std::addressof
помечен как constexpr, поэтому я предполагаю, что он должен работать.