Когда адрес непосредственной функции можно использовать в качестве аргумента шаблона?C++

Программы на C++. Форум разработчиков
Anonymous
Когда адрес непосредственной функции можно использовать в качестве аргумента шаблона?

Сообщение Anonymous »

При каких обстоятельствах (если таковые имеются) можно использовать адрес непосредственной функции в качестве нетипового аргумента некоторого шаблона?
В приведенном ниже примере я пытаюсь передать адрес непосредственной функции foo в качестве нетипового аргумента шаблона класса A дважды: один раз внутри панели непосредственной функции и второй раз в обычном контексте:

Код: Выделить всё

consteval void foo() {}

template  struct A{ int i = 1; };

consteval auto bar() {
return A{};
}

// ok in GCC and MSVC
auto a = bar();

// ok in GCC only
auto b = A{};
В этом примере компиляторы расходятся:
  • Clang отклоняет обе попытки с ошибкой:
примечание: указатель на константное объявление не является постоянным выражением
  • MSVC отклоняет только второй случай auto b = A{}; с ошибкой:
ошибка C7596: 'foo': невозможно принять адрес непосредственной функции вне немедленного вызова
  • И GCC принимает оба случая. Онлайн-демо
Какая реализация здесь правильная?

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-argument

Вернуться в «C++»