gpt4 book ai didi

c++ - std::clamp - 检测函数返回值是否绑定(bind)到 const T&

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:08 25 4
gpt4 key购买 nike

最好不要将 std::clamp 返回值绑定(bind)到 const ref,如果它的 minmax 参数之一是右值.

std::clamp 的典型实现(非常简化):

template <class T>
constexpr const T& clamp(const T& value, const T& min, const T& max)
{
return value < min ? min : max < value ? max : value;
}

正如 cppreference for std::clamp 中所述当有人写下时,情况很危险:

int n = -1;
const int& r = std::clamp(n, 0, 255);
// r is dangling

有没有办法在编译时检测这些情况?

最佳答案

如果您愿意编写自己的钳位函数,您可以检测到这一点并采取一些措施。

例如,假设您希望 clamp 函数按值返回,如果这是确保我们不会获得悬空引用的唯一方法的话:

#include <type_traits>

template<class A, class B, class C>
constexpr std::conditional_t<
std::is_lvalue_reference<A &&>::value && std::is_lvalue_reference<B &&>::value && std::is_lvalue_reference<C &&>::value,
std::add_lvalue_reference_t<std::common_type_t<A, B, C>>,
std::common_type_t<A, B, C>
> clamp(A && value, B && min, C && max)
{
return value < min ? min : max < value ? max : value;
}

这将使 clamp(n, 0, 255) 有效地具有签名 int clamp(int&, int&&, int&&);如果所有 3 个输入都是左值引用,您只会得到 int & clamp(int&, int&, int&)。如果您愿意,使返回的引用 const 是微不足道的。

如果函数不是全是左值引用,您也可以让函数编译失败:

#include <type_traits>

template<class A, class B, class C>
constexpr std::add_lvalue_reference_t<std::common_type_t<A, B, C>>
clamp(A && value, B && min, C && max)
{
static_assert(std::is_lvalue_reference<A &&>::value && std::is_lvalue_reference<B &&>::value && std::is_lvalue_reference<C &&>::value, "");

return value < min ? min : max < value ? max : value;
}

关于c++ - std::clamp - 检测函数返回值是否绑定(bind)到 const T&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41869874/

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