Я по ошибке вставил throw
заявление после return
со следующим конечным результатом:
void DXManager::initialize(const std::shared_ptr<nae::Context>& ctx_ptr)
{
// ...
if (FAILED(result))
{
return throw std::exception("Failed to enumerate display mode list");
}
// ...
}
Я успешно построил решение, прежде чем заметил ошибку, и мне любопытно, какая спецификация допускает приведенный выше синтаксис.
Чтением cppreference.com (под примечаниями), я вижу
Выражение throw классифицируется как выражение prvalue типа void. Как и любое другое выражение, оно может быть подвыражением в другом выражении, чаще всего в условном операторе:
double f(double d) { return d > 1e7 ? throw std::overflow_error("too big") : d; } // ...
но я не совсем уверен, что это то, что я ищу.
Ну, это потому, что оператор возврата в функции, возвращающей void
может иметь void
операнд:
выраж-или-приготовился-INIT-лист оператора возврата называется его операндом […] оператор возврата с операндом типа
void
должны использоваться только в
функция с типом возвращаемого значения cvvoid
,
И как вы узнали сами, throw
выражение имеет тип void
, Это положение сделано для того, чтобы сделать общий код более плавным. Учти это:
template<typename T>
T foo() {
return T();
}
Вышеуказанное правило (вместе с другим правилом, которое определяет void()
) сделать приведенный выше шаблон действительным даже при создании экземпляра для void
,
Других решений пока нет …