Как переслать как правую, так и левую ссылку на значение в шаблоне - PullRequest
2 голосов
/ 20 января 2020

Я запутался в пересылке ссылок на юниверсы в шаблонах. Мой код выглядит следующим образом:

  class A {
  public:
      void fn(std::unique_ptr<std::string> n) {
          (*n) += "1";
          cout << "n: " << *n << endl;
      }

      void fn2(std::string& n) {
          n += "2";
          cout << "n: " << n << endl;
      }
  };

  template <typename Func, typename Class, typename... Args>
  std::thread create_thread(Func&& func, Class* this_ptr, Args&&... args) {
      auto handler = [&] {
          (this_ptr->*func)(std::forward<Args>(args)...); // error
      };
      return std::thread(handler);
  }

  int main() {
      auto str1 = std::make_unique<std::string>("a");
      auto str2 = "b";
      A a;
      auto t1 = create_thread(&A::fn, &a, std::move(str1));
      auto t2 = create_thread(&A::fn2, &a, std::ref(str2));
      t1.join();
      t2.join();

      return 0;
  }
error: cannot bind non-const lvalue reference of type ‘std::basic_string<char>&’ to an rvalue of type ‘std::basic_string<char>’

Я также попытался std::forward(args...) вместо этого, поскольку C ++ 17 может автоматически получать тип шаблона. Также не сработало (не подходит для std::forward?).

Так как переадресовать ссылку на правое и левое значения в одной шаблонной функции? Заранее спасибо.

1 Ответ

6 голосов
/ 20 января 2020

str2 - это массив символов, а не std::string, компилятор пытается создать временный std::string из вашего массива символов, но, поскольку fn2 принимает неконстантную ссылку, временное значение не может быть использовано .

Если вы измените str2 на std:: string, он, вероятно, скомпилируется.

...