在考虑可以做些什么来解决std::min
悬空引用问题时,我想到的一个想法是为将被删除的右值添加一个重载(实际上每个组合为 3 个)。问题是这T&&
将是一个转发引用,而不是一个右值引用。
我想将这个问题与std::min
具体问题分开并使其更笼统。std::min
可以作为一个例子,为什么你需要这样的东西。
让我们简化和概括问题:
// this has the same problem as `std::min`: if t binds to a temporary,
// and the result is assigned to `auto&`, the result is a dangled reference
template <class T>
const T& foo(const T& t)
{
return t;
}
// incorrect attempt to prevent foo from being called with a temporary argument
// `T&&` is a forwarding reference, not an rvalue reference
template <class T>
const T& foo(T&& t) = delete;
问题是:如何控制泛型模板参数T
可以绑定到哪些类型的引用?它如何扩展多个参数(例如std::min
以防万一)?