Почему оператор noexcept
принимает выражение, а не сигнатуру/декларацию функции?
Рассмотрим следующий фиктивный пример:
#include <string>
void strProcessor(const std::string& str) noexcept(true) { };
struct Type{
void method1() noexcept(strProcessor("")) { //Error: Call to nonconstexpr function
strProcessor("");
}
};
Он не скомпилируется, потому что method1
имеет выражение, отличное от constexpr, в своем noexcept, но зачем мне в первую очередь помещать туда выражение?
Все, что я хочу сделать, это сообщить компилятору, что method1
является noexcept, если и только если вызов strProcessor
с успешно созданной строкой является noexcept (что так и есть).
Так почему бы не noexcept(void strProcessor(const std::string&))
?
Еще один похожий фиктивный пример:
struct Type{
Type(bool shouldThrow=false) noexcept(false) { if(shouldThrow) throw "error"; };
void method1() noexcept(true) {};
void method2() noexcept(noexcept(Type().method1())) { method1(); };
}
Здесь я хотел бы сказать, что method2
не является исключением, если и только если вызов method1
для успешно созданного экземпляра Type имеет значение noexcept (что в данном случае и есть), но Type
даже не завершен в точке, где method2
идентификатор определен.
Пожалуйста, объясните, если я неправильно понимаю эту функцию.
declval
и друзей, чтобы избежать побочных эффектов и т. д. Я действительно не понимаю ошибку, хотя я не слишком горяч ни кnoexcept
, ни кconstexpr
. - person Lightness Races in Orbit   schedule 27.07.2015