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

Я никогда не видел [[ без возврата ]] раньше использовался в функциях, не возвращающих 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;

это проявит какое-нибудь неопределенное поведение?

18

Решение

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

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

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

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

23

Другие решения

Из стандарта C ++ §7.6.8 / p2 атрибут Noreturn [dcl.attr.noreturn] (Акцент на шахте):

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

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

10

По вопросам рекламы [email protected]