我有一个函数,用于生成一个 lambda 函数来包装一个我之后可以调用的函数。
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 )... );
};
}
如果参数f
是noexcept
,我希望返回的lambda表达式也是noexcept
的,这样我的函数返回值将会是这个样子:
return [&] () noexcept( is_noexcept<decltype( f )>::value )
-> std::result_of_t<F( FArgs... )>
{
return std::forward<F>( f )( std::forward<FArgs>( f_args )... );
};
我的尝试:
#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
}
然而,测试始终返回true
。我错过了什么?是否有人能提供解决此问题的方法?
f()
和g()
返回true
。 - user2296177std::declval
、std::forward
或简单的f
),而不是表达式,使用noexcept
总是会导致结果为false
,甚至会有gcc的警告。再次强调,经过了严格的测试。奇怪的是,我在/usr/include/c++/type_traits
中发现的std::is_nothrow_destructible
实现依赖于类似于std::integral_constant<bool, noexcept(declval<T>().~T())>
的东西,但我认为这在表达式方面是一个灰色区域(仍然很困惑)。 - mr.stobbe