完美转发解释为右值引用
Perfect forwarding interpreted as rvalue reference
我的理解是 ConcreteType&&
是右值,TemplateType&&
是 "perfect forwarding"。
我正在尝试使用完美转发,但 clang-tidy 将其解释为右值引用。
clang 和 gcc 没有抱怨,但 clang-tidy 在进行任何进一步分析之前将其标记为解析错误,所以我不确定这是代码问题还是 clang-tidy 问题。
我怀疑这与我在构造函数中使用它有关,但我不确定。
最小代码:
#include <memory>
template <typename T>
class my_wrapper {
T val;
public:
my_wrapper(T&& val_)
: val{std::forward<T>(val_)} {}
};
struct my_struct {
int x;
};
auto xyz() {
my_struct ms{3};
return my_wrapper<my_struct>(ms);
}
错误信息:
Error while processing /path/foo.cpp.
/path/foo.cpp:20:25: error: no matching constructor for initialization of 'my_wrapper<my_struct>' [clang-diagnostic-error]
my_wrapper<my_struct> wrap(ms);
^
/path/foo.cpp:5:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'my_struct' to 'const my_wrapper<my_struct>' for 1st argument
class my_wrapper {
^
/path/foo.cpp:5:7: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'my_struct' to 'my_wrapper<my_struct>' for 1st argument
/path/foo.cpp:9:3: note: candidate constructor not viable: no known conversion from 'my_struct' to 'my_struct &&' for 1st argument
my_wrapper(T&& val_)
^
T
在调用构造函数时已完全解析,因此不再是完美转发
如果你想完美转发一个函数,它必须是模板化的函数本身,而不是封闭的class。
像这样:
template <typename T>
class my_wrapper {
T val;
public:
template<typename U>
my_wrapper(U&& val_)
: val{std::forward<U>(val_)} {}
};
我的理解是 ConcreteType&&
是右值,TemplateType&&
是 "perfect forwarding"。
我正在尝试使用完美转发,但 clang-tidy 将其解释为右值引用。
clang 和 gcc 没有抱怨,但 clang-tidy 在进行任何进一步分析之前将其标记为解析错误,所以我不确定这是代码问题还是 clang-tidy 问题。
我怀疑这与我在构造函数中使用它有关,但我不确定。
最小代码:
#include <memory>
template <typename T>
class my_wrapper {
T val;
public:
my_wrapper(T&& val_)
: val{std::forward<T>(val_)} {}
};
struct my_struct {
int x;
};
auto xyz() {
my_struct ms{3};
return my_wrapper<my_struct>(ms);
}
错误信息:
Error while processing /path/foo.cpp.
/path/foo.cpp:20:25: error: no matching constructor for initialization of 'my_wrapper<my_struct>' [clang-diagnostic-error]
my_wrapper<my_struct> wrap(ms);
^
/path/foo.cpp:5:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'my_struct' to 'const my_wrapper<my_struct>' for 1st argument
class my_wrapper {
^
/path/foo.cpp:5:7: note: candidate constructor (the implicit move constructor) not viable: no known conversion from 'my_struct' to 'my_wrapper<my_struct>' for 1st argument
/path/foo.cpp:9:3: note: candidate constructor not viable: no known conversion from 'my_struct' to 'my_struct &&' for 1st argument
my_wrapper(T&& val_)
^
T
在调用构造函数时已完全解析,因此不再是完美转发
如果你想完美转发一个函数,它必须是模板化的函数本身,而不是封闭的class。
像这样:
template <typename T>
class my_wrapper {
T val;
public:
template<typename U>
my_wrapper(U&& val_)
: val{std::forward<U>(val_)} {}
};