Когда адрес непосредственной функции можно использовать в качестве аргумента шаблона?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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