Могу ли я использовать [[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.