повсюду я вижу пример кода, подобного этому (не проверенного на компиляцию) в операторе try-исключением и throw, представленном в большинстве реализаций c ++:
void subfunction(int a)
{
throw;
}
void function(int a)
{
try
{
subfunction(a)
}
catch(...)
{
}
}
Теперь мне интересно, есть ли веская причина, почему эквивалент function()
или же subfunction()
(почти) всегда в этих образцах реализуется как пустота в этих образцах. есть ли конкретная причина или влияние в отношении трех упомянутых специальных c++
ключевые слова? что может означать предупреждение типа «функция пропускает оператор возврата», «не все пути управления возвращают значение» и тому подобное? это ключевое слово «throw» где-то внутри, помечено как noreturn
или аналогичный (как можно найти в «exit ()» для некоторых компиляторов)?
PS В настоящее время я нахожусь на MSVS 2012 с соответствующим MSVC, но я использую и другие компиляторы, такие как GNUC в его различных текущих версиях.
throw
может использоваться в не void-функции.
throw
«имеет noreturn
атрибут не должен провоцировать предупреждение о «не все пути управления возвращают значение» для кода, похожего на
double my_div(double a, double b)
{
if (b == 0.) {
throw std::runtime_error("division by zero");
// No warning here
} else {
return a / b;
}
}
Других решений пока нет …