在C ++ 17中弃用`std :: result_of`的原因是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C ++ 17中弃用`std :: result_of`的原因是什么?相关的知识,希望对你有一定的参考价值。

我看到std::result_of在C ++ 17中被弃用了。

  • std::result_of在C ++ 17中被弃用的原因是什么?
  • 另外我想知道std::result_ofstd::invoke_result之间的区别。
答案

T.C。已经提供了明显的联系,但也许最可怕的原因可以重复:result_of涉及形成类型F(Arg1, Arg2, ...)不是为了返回F的那些类型的函数,而是接受这些类型的F类型的函数。 (毕竟,返回类型是result_of的结果,而不是输入!)

除了与形成函数类型相关的调整之外,两者之间的唯一区别是语法。

另一答案

@haelix;

关于cppreference页面上缺少示例,我完全和你在一起。这是我的看法:

auto add_auto_fn(int a, int b) {
    return a + b;
}

template<typename U, typename V>
auto add_auto_template_fn(U a, V b) {
    return a + b;
}

int fortytwo(int a, int b) { return a + 42; }

struct my_functor{
    auto operator() (int a) { return a + 42; }
};

void test_invoke_result()
{
    {
        // For functions and auto function: use < decltype(&f), Args... >
        using T = std::invoke_result< decltype(&fortytwo), int, int>::type;
        static_assert(std::is_same<T, int>::value, "");
    }
    {
        // For templated auto functions: use < decltype(&f)<Args...>, Args... >
        using T = std::invoke_result< decltype(&add_auto_template_fn<int, double>), int, double>::type;
        static_assert(std::is_same<T, double>::value, "");
    }
    {
        // For simple lambdas: use < decltype(lambda), Args... >
        auto simple_lambda = [](int a) {  return a + 42; };
        using T = std::invoke_result< decltype(simple_lambda), int>::type;
        static_assert(std::is_same<T, int>::value, "");
    }
    {
        // For generic lambdas: use < decltype(lambda), Args... >
        auto generic_lambda = [](auto a) {  return a + 42; };
        using T = std::invoke_result< decltype(generic_lambda), double>::type;
        static_assert(std::is_same<T, double>::value, "");
    }
    {
        // For functors: use < functor, Args... >
        using T = std::invoke_result< my_functor, int>::type;
        static_assert(std::is_same<T, int>::value, "");
    }

}

void test_result_of()
{
    {
        // For functions and auto function: use < decltype(&f)(Args...) >
        using T = std::result_of< decltype(&fortytwo)(int, int)>::type;
        static_assert(std::is_same<T, int>::value, "");
    }
    {
        // For templated auto functions: use < decltype(&f<Args...>)(Args...) >
        using T = std::result_of< decltype(&add_auto_template_fn<int, double>)(int, double)>::type;
        static_assert(std::is_same<T, double>::value, "");
    }
    {
        // For simple lambdas: use < decltype(lambda)(Args...) >
        auto simple_lambda = [](int a) {  return a + 42; };
        using T = std::result_of< decltype(simple_lambda)(int)>::type;
        static_assert(std::is_same<T, int>::value, "");
    }
    {
        // For generic lambdas: use < decltype(lambda)(Args...) >
        auto generic_lambda = [](auto a) {  return a + 42; };
        using T = std::result_of< decltype(generic_lambda)(double)>::type;
        static_assert(std::is_same<T, double>::value, "");
    }
    {
        // For functors: use < functor(Args...) >
        using T = std::result_of< my_functor(int)>::type;
        static_assert(std::is_same<T, int>::value, "");
    }

}

以上是关于在C ++ 17中弃用`std :: result_of`的原因是什么?的主要内容,如果未能解决你的问题,请参考以下文章

thumbnailImageAtTime:timeOption 已弃用:首先在 iOS 7 中弃用

如何在 PHPDoc 中弃用 PHP 的魔法属性?

如何在 Xcode 中弃用方法

Firebase 实例 ID:在 21.0.0 中弃用 getId()

UIAlertView 已弃用:首先在 iOS 9.0 中弃用 - UIAlertView 已弃用。将 UIAlertController 与首选样式一起使用

Android P 中弃用的 DialogFragment 类