首页 > 解决方案 > 通过引用传递时无法访问转发类型的类型别名

问题描述

我的问题围绕以下代码:

template<typename T>
static void whatever(T&& container) {
  typename T::value_type x;
  std::cout << x << std::endl;
}

struct something {
  using value_type = int;

  const char* name;
};

int main() {
  whatever(something{});  // passes by rvalue, perfectly fine.
  something x;
  whatever(x);  // deduces the type as something& and complains ::value_type doesn't exist.
  return 0;
}

现在,如果我为任何需要引用的方法提供重载。

template<typename T>
static void whatever(T& container);

问题会消失,但我对这两种方法都有完全相同的代码,我想知道是否有一种很好的方法可以将这一切都放在一个方法中。

这只是我为提出问题而提出的示例代码。

标签: c++templates

解决方案


您必须从推导T类型中删除引用,例如使用std::decay_t

typename std::decay_t<T>::value_type x;

推荐阅读