请考虑以下事项:
template<class T>
void Destroy(T&& t) {
// Do something dangerous to `t`
}
作者打算编写一个接受任何右值的函数,并做一些破坏它的东西。但是,这不是此处发生的情况 - 如果使用左值Destroy
调用U
,则T
推断为U&
,t
的类型为U&
1}}参考折叠后。这意味着当作者希望这样的调用无法编译时,它会编译左值。
无法禁用参考折叠(例如
)template<class T>
void Destroy(typename remove_reference<T>::type&& t) {
// Do something dangerous to `t`
}
)因为::
完全禁用模板参数推断。
这是static_assert
唯一的出路吗?
template<class T>
void Destroy(T&& t) {
static_assert(!is_lvalue_reference_v<T>, "Don't call with lvalues!");
// Do something dangerous to `t`
}