[英]No matching function for call std::forward(const std::string &) with variadic arguments
I'm trying to make a movable wrapper to non-copyable, non-movable class, however I have a problem passing a const std::string
variable to the constructor. 我试图将一个可移动的包装器设置为不可复制的,不可移动的类,但是我将const std::string
变量传递给构造const std::string
遇到了问题。 The minimal example below produces following error: 下面的最小示例产生以下错误:
#include <iostream>
#include <memory>
#include <string>
#include <utility>
struct X {
std::string x;
X(const std::string &x) : x(x) {}
X(const X &x) = delete;
X(X &&x) = delete;
};
struct Wrapper {
std::unique_ptr<X> x;
Wrapper(const Wrapper & wrapper) = delete;
Wrapper(Wrapper && wrapper) = default;
template<typename... Args>
Wrapper(Args&&... args) : x(std::make_unique<X>(std::forward(args)...)) {}
};
int main() {
const std::string XXX = "XXX";
Wrapper w{XXX};
std::cout << w.x->x << std::endl;
}
Error message here: 错误信息:
forwarding.cc:21:53: error: no matching function for call to 'forward'
Wrapper(Args&&... args) : x(std::make_unique<X>(std::forward(args)...)) {}
^~~~~~~~~~~~
forwarding.cc:26:13: note: in instantiation of function template specialization 'Wrapper::Wrapper<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &>' requested here
Wrapper w{XXX};
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/bits/move.h:73:5: note: candidate template ignored: couldn't infer template argument '_Tp'
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/7.2.0/../../../../include/c++/7.2.0/bits/move.h:84:5: note: candidate template ignored: couldn't infer template argument '_Tp'
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
^
1 error generated.
You need to explicitly pass template parameters to std::forward
: 您需要将模板参数显式传递给std::forward
:
std::forward<Args>(args)...
This is because std::forward
needs some way of knowing the "original value category" of args...
, which is impossible through template argument deduction alone as args
is always an lvalue. 这是因为std::forward
需要某种方式来了解args...
的“原始值类别” args...
这是不可能通过模板参数推导单独进行的,因为args
总是一个左值。
Lvalues will deduced as lvalue references in the context of template argument deduction for forwarding references (as a special rule), so std::forward
can do its job by looking at the types inside Args...
. Lvalues将在转发引用的模板参数推导的上下文中推断为左值引用 (作为特殊规则),因此std::forward
可以通过查看Args...
内部的类型来完成它的工作Args...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.