ben sonradan çağırabileceği bir işleve sarıcı olarak davranan bir lambda oluşturmak için fonksiyonu var:Şablon argümanının noexcept işlevi olup olmadığını nasıl anlarım?
template <typename F, typename... FArgs>
auto make_lambda(F&& f, FArgs&&... f_args)
{
return [&]() -> std::result_of_t<F(FArgs...)>
{
return std::forward<F>(f)(std::forward<FArgs>(f_args)...);
};
}
ben yapmak istiyorum döndü lambda noexcept
argüman f
noexcept
, yani benim işlevin dönüş olur iken şu şekilde görünür:
return [&]() noexcept(is_noexcept<decltype(f)>::value)
-> std::result_of_t<F(FArgs...)>
{
return std::forward<F>(f)(std::forward<FArgs>(f_args)...);
};
girişimim:
#include <type_traits>
void f() {}
void g() noexcept {}
template <typename F, typename... Args>
struct is_noexcept : std::false_type {};
template <typename F, typename... Args>
struct is_noexcept<F(Args...) noexcept> : std::true_type {};
int main()
{
bool constexpr func_test_a{ is_noexcept<decltype(f)>::value }; // true
bool constexpr func_test_b{ is_noexcept<decltype(g)>::value }; // true
}
Ancak, te st, her zaman true
değerini döndürür. Neyi kaçırıyorum? Bu soruna çözüm önerisi olan var mı?
Denediğim ilk şey buydu, ancak yine de 'f()' ve 'g()' için 'true' döndürüyor. – user2296177
Cevabımda belirtildiği gibi, bu C++ 17'de geçerli bir cevap olacaktır. – user2296177