小编Lei*_*Hua的帖子

为什么移动返回一个右值引用参数需要用 std::move() 包装它?

我正在阅读 Effective Modern C++ Item 25, on page 172,它有一个例子来证明,如果你想移动返回一个右值引用参数,你需要用 std::move(param) 包装它。由于参数本身总是一个左值,如果没有 std::move(),它将被复制返回。

我不明白。如果 std::move(param) 只是将它接受的参数转换为右值引用,那么当 param 已经是右值引用时有什么区别?

就像下面的代码:

#include <string>
#include <iostream>
#include <utility>

template<typename T>
class TD;

class Widget {
public:
    explicit Widget(const std::string& name) : name(name) {
        std::cout << "Widget created with name: " << name << ".\n";
    }

    Widget(const Widget& w) : name(w.name) {
        std::cout << "Widget " << name << " just got copied.\n";
    }

    Widget(Widget&& w) : name(std::move(w.name)) {
        std::cout << "Widget " << name …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

5
推荐指数
2
解决办法
1033
查看次数

如何使用 std::invoke_result_t 获取函数的返回类型

我正在尝试实现一个风味的for_each(),当传入的函数返回时它将停止迭代false。如果传入的函数没有返回布尔值,则作为std::for_each().

我在获取函数参数的返回类型时遇到了一些困难,我尝试使用std::invoke_result_t,但它抱怨:

“std::__1::invoke_result<...”中没有名为“type”的成员

在C++ 参考示例中,它总是传入Arg函数的类型。但就我而言,类型不应该F已经包含整个函数的所有类型信息吗?

template<class C, class F>
void for_each(C container, F&& f)
{
    for (auto const& v : container)
    {
        if constexpr (std::is_same_v<std::invoke_result_t<F>, bool>)
        {
            if (not std::forward<F>(f)(v))
                break;
        }
        else
        {
            std::forward<F>(f)(v);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ c++17

3
推荐指数
1
解决办法
3455
查看次数

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

c++17 ×1