Насколько я понимаю, ConcreteType&&
было rvalue, а TemplateType&&
было «идеальной пересылкой».
Я пытаюсь использовать идеальную пересылку, но clang-tidy интерпретирует его как ссылку rvalue.
clang и g cc не жалуются, но 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_)
^