Я никогда не видел [[ без возврата ]] раньше использовался в функциях, не возвращающих void.
Хорошо ли определено следующее?
[[ 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;
это проявит какое-нибудь неопределенное поведение?
Стандартная спецификация на [[noreturn]]
находится в [dcl.attr.noreturn]. Весь нормативный текст гласит:
Атрибут-маркер
noreturn
указывает, что функция не возвращает. Это должно появиться не более одного раза в
каждый список атрибутов и нет атрибут-аргумент придаточного должен присутствовать. Атрибут может быть применен к
описатель-идентификатор в объявлении функции. Первое объявление функции должно указыватьnoreturn
атрибут, если любое объявление этой функции определяетnoreturn
приписывать. Если функция объявлена с
noreturn
атрибут в одной единице перевода и та же функция объявляется безnoreturn
атрибут в другой единице перевода, программа плохо сформирована; Диагностика не требуется.Если функция
f
называется гдеf
ранее был объявлен сnoreturn
атрибут иf
в конце концов возвращается,
поведение не определено.
Там нет упоминания о возвращении тип. Единственное, что имеет значение, это то, что функция не возвращается. Если функция возвращает void
или же int
или же vector<vector<double>>
), то поведение не определено. Если функция не возвращается, тип возвращаемого значения не имеет значения.
Из стандарта C ++ §7.6.8 / p2 атрибут Noreturn [dcl.attr.noreturn] (Акцент на шахте):
Если функция f вызывается там, где f ранее была объявлена с
атрибут noreturn и f в конечном итоге возвращается, поведение
не определено. [Примечание: функция может завершиться, бросив
исключение. — примечание конца] [Примечание: реализации рекомендуется
выдайте предупреждение, если функция, помеченная [[noreturn]], может вернуться. — конец
нота ]
Поскольку ваша функция никогда не достигнет return 0;
Там нет UB.