Могу ли я использовать [[noreturn]] для невозвратных возвращающих функций?

Я никогда не видел [[noreturn]], используемого ранее для невоидных функций возврата.

Является ли следующее определение корректным?

[[ noreturn ]] int function();

int function(){
  while(true){/* impl */}
  return 0;
}

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

Итак, предполагая, что вызывающий объект выглядит примерно так:

//call the non-returning function
int var = (*fptr)();

//use var some way (even though the function will never actually return)
std::cout << var;

проявится ли какое-либо поведение undefined?

Ответы

Ответ 1

Стандартная спецификация на [[noreturn]] находится в [dcl.attr.noreturn]. Все нормативные тексты гласят:

Атрибут-токен noreturn указывает, что функция не возвращается. Он должен появиться не более одного раза в каждый атрибут-список и атрибут-аргумент-атрибут должны присутствовать. Атрибут может применяться к идентификатор объявления в объявлении функции. В первом объявлении функции указывается noreturnесли какое-либо объявление этой функции указывает атрибут noreturn. Если функция объявлена ​​с помощью атрибут noreturn в одной единицы перевода, и одна и та же функция объявляется без noreturnатрибут в другой единицы перевода, программа плохо сформирована; не требуется диагностика.

Если вызывается функция f, где f была объявлена ​​ранее с атрибутом noreturn, а f в конечном итоге возвращается, поведение undefined.

Не упоминается тип возврата. Единственное, что имеет значение, это то, что функция не возвращается. Если функция возвращает (void или int или vector<vector<double>>), то поведение undefined. Если функция не возвращается, возвращаемый тип несуществен.

Ответ 2

Из стандарта С++ §7.6.8/p2 атрибут Noreturn [dcl.attr.noreturn] (Emphasis Mine):

Если функция f вызывается, где f ранее объявлялась с помощью атрибут noreturn и f в конечном итоге возвращается, поведение undefined. [Примечание: функция может завершаться путем исключение. - примечание к концу] [Примечание. Реализации поощряются к выдать предупреждение, если функция, отмеченная [[noreturn]], может вернуться. - конец примечание]

Так как ваша функция никогда не достигнет return 0;, там нет UB.