gpt4 book ai didi

c++ - 控制 `T` 绑定(bind)什么样的引用

转载 作者:太空狗 更新时间:2023-10-29 23:49:58 26 4
gpt4 key购买 nike

在思考可以做些什么来解决std::min dangling reference problem ,我的一个想法是为将被删除的右值添加一个重载(实际上是 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 可以绑定(bind)到哪种引用?它如何针对多个参数进行扩展(如 std::min 情况)?

最佳答案

你可以

template <typename T>
std::enable_if_t<std::is_rvalue_reference<T&&>::value>
foo(T&&) = delete;

Demo

对于 2 个参数,它变成:

template <typename T1, typename T2>
std::enable_if_t<
(std::is_rvalue_reference<T1&&>::value
|| std::is_rvalue_reference<T1&&>::value)
&& std::is_same<std::decay_t<T1>, std::decay_t<T2>>::value
>
foo(T1&&, T2&&) = delete;

Praetorian 的版本是:

template <class T> void foo(const T&&, const T&) = delete;
template <class T> void foo(const T&, const T&&) = delete;
template <class T> void foo(const T&&, const T&&) = delete;

关于c++ - 控制 `T` 绑定(bind)什么样的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35044763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com