为什么const&& as_const的重载被删除了吗?

时间:2016-01-02 12:49:53

标签: c++ templates const c++17

blog on the progress of C++17上,我读了以下内容:

  

P0007提出了一个辅助函数模板as_const   获取引用并将其作为对const的引用返回。

template <typename T> std::add_const_t<T>& as_const(T& t) { return t }
template <typename T> void as_const(T const&&) = delete;

为什么删除const&&重载?

1 个答案:

答案 0 :(得分:13)

考虑如果你没有超载会发生什么,并尝试传入const右值:

template <typename T> const T &as_const(T &t) { return t; }
struct S { };
const S f() { return S{}; }
int main() {
  // auto & ref = as_const(S()); // correctly detected as invalid already
  auto & ref = as_const(f()); // accepted
}

这是可以接受的,因为T会被推断为const S,而临时工具可以绑定到const S &。结果是你不小心得到一个临时的左值引用,它将在ref初始化后立即销毁。几乎所有采用左值(无论是变量还是函数参数)的用户都不希望传递临时值;默默地接受临时工作意味着你很容易默默地获得悬挂的参考资料。