Защо операторът 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
е noexcept, ако извикването на method1
на успешно конструиран екземпляр на Type е noexcept (което е в този случай), но Type
дори не е завършено в точката, където method2
ID дефиниран.
Моля, обяснете, ако разбирам погрешно тази функция.
declval
и приятели, за да избегнете странични ефекти и т.н. Наистина не разбирам грешката обаче, тъй като не съм много запален нито поnoexcept
, нито поconstexpr
. - person Lightness Races in Orbit   schedule 27.07.2015