gpt4 book ai didi

c++ - 如何在模板中转发左右值引用

转载 作者:行者123 更新时间:2023-12-02 00:38:45 25 4
gpt4 key购买 nike

我对在模板中转发 Universe 引用感到困惑。我的代码如下:

  class A {
public:
void fn(std::unique_ptr<std::string> n) {
(*n) += "1";
cout << "n: " << *n << endl;
}

void fn2(std::string& n) {
n += "2";
cout << "n: " << n << endl;
}
};

template <typename Func, typename Class, typename... Args>
std::thread create_thread(Func&& func, Class* this_ptr, Args&&... args) {
auto handler = [&] {
(this_ptr->*func)(std::forward<Args>(args)...); // error
};
return std::thread(handler);
}

int main() {
auto str1 = std::make_unique<std::string>("a");
auto str2 = "b";
A a;
auto t1 = create_thread(&A::fn, &a, std::move(str1));
auto t2 = create_thread(&A::fn2, &a, std::ref(str2));
t1.join();
t2.join();

return 0;
}
error: cannot bind non-const lvalue reference of type ‘std::basic_string<char>&’ to an rvalue of type ‘std::basic_string<char>’

我还尝试了 std::forward(args...) 因为 C++17 可以自动获取模板类型。也不起作用(不适合 std::forward?)。

那么如何在一个模板函数中转发左右值引用呢?提前致谢。

最佳答案

str2 是一个字符数组,而不是 std::string,编译器正在尝试从您的代码创建一个临时 std::string字符数组,但由于 fn2 采用非常量引用,因此无法使用临时值。

如果将 str2 更改为 std::string 它可能会编译。

关于c++ - 如何在模板中转发左右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59817472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com