完美转发解释为r值参考

问题描述 投票:3回答:1

我的理解是 ConcreteType&& 是一个r值和 TemplateType&& 是 "完美转发"。

我试图使用完美转发,但clang-tidy将其解释为rvalue引用。

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_)
  ^
c++ rvalue perfect-forwarding clang-tidy
1个回答
6
投票

T 在调用构造函数的时候已经完全解析了,所以不是完美转发了。

如果你想在一个函数上实现完美的转发,必须是函数本身的模板化,而不是包围类。

像这样。

template <typename T>
class my_wrapper {
  T val;

public:
  template<typename U>
  my_wrapper(U&& val_)
      : val{std::forward<U>(val_)} {}
};
© www.soinside.com 2019 - 2024. All rights reserved.