Идеальная пересылка интерпретируется как ссылка rvalue - PullRequest
3 голосов
/ 05 мая 2020

Насколько я понимаю, 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_)
  ^

1 Ответ

6 голосов
/ 05 мая 2020

T полностью разрешается к моменту вызова конструктора, так что это уже не идеальная пересылка

Если вам нужна идеальная пересылка для функции, это должна быть сама функция, которая является шаблоном, а не охватывающий класс.

Примерно так:

template <typename T>
class my_wrapper {
  T val;

public:
  template<typename U>
  my_wrapper(U&& val_)
      : val{std::forward<U>(val_)} {}
};
...