如何在不禁用模板参数推断的情况下禁用转发引用行为?

时间:2015-12-02 02:25:07

标签: c++ templates rvalue-reference argument-deduction

请考虑以下事项:

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`
}

0 个答案:

没有答案