m
Size: a a a
m
DS
DS
DS
DS
SS
ПК
std::set<int>
DS
std::set<int>
ПК
DS
ПК
DS
DS
O
is_nothrow_invocable_r
для C++11, за основу для реализации взял этот C++20 пример, но столкнулся при реализации с проблемой:struct bar { bar(int) noexcept; };В C++17 проверка ожидаемо проходит, а в C++14 — нет. Что-то поменялось в стандарте на этот счёт? (Думаю, что это
static_assert(noexcept(std::declval<void(&)(bar) noexcept>()(42)), "");
"The noexcept-specification is a part of the function type and may appear as part of any function declarator (since C++17)"
)static_assert(noexcept(static_cast<To>(std::declval<From>())), "");
NV
АК
is_nothrow_invocable_r
для C++11, за основу для реализации взял этот C++20 пример, но столкнулся при реализации с проблемой:struct bar { bar(int) noexcept; };В C++17 проверка ожидаемо проходит, а в C++14 — нет. Что-то поменялось в стандарте на этот счёт? (Думаю, что это
static_assert(noexcept(std::declval<void(&)(bar) noexcept>()(42)), "");
"The noexcept-specification is a part of the function type and may appear as part of any function declarator (since C++17)"
)static_assert(noexcept(static_cast<To>(std::declval<From>())), "");
АК
noexcept(foo(1, 2, 3))
. Так что замена выглядит корректнойO
noexcept(foo(1, 2, 3))
. Так что замена выглядит корректнойstatic_cast
. Полагаю, это как-то связано с формулировкой стандарта:The predicate condition for a template specialization is_convertible<From, To> shall be satisfied if and only if the return expression in the following code would be well-formed, including any implicit conversions to the return type of the function:
To test() {
return declval<From>();
}
Но я, тем не менее не знаю, в чём принципиальное отличие этой функции от static_cast<To>(declval<From>())
. На ум приходят какие-то мысли об RVO или поведении деструктора, но, кажется, мне не хватает пониманияDC