gpt4 book ai didi

c++ - add_lvalue_reference实现示例

转载 作者:行者123 更新时间:2023-12-01 14:58:19 25 4
gpt4 key购买 nike

cppreference上查找std::add_lvalue_reference时,可以看到以下实现示例:

namespace detail {

template <class T>
struct type_identity { using type = T; }; // or use std::type_identity (since C++20)

template <class T>
auto try_add_lvalue_reference(int) -> type_identity<T&>;
template <class T>
auto try_add_lvalue_reference(...) -> type_identity<T>;

} // namespace detail

template <class T>
struct add_lvalue_reference : decltype(detail::try_add_lvalue_reference<T>(0)) {};

为什么需要第二个 try_add_lvalue_reference?在什么情况下会代替第一个?

最佳答案

第二个重载负责cppreference上定义中的“其他”条件:

1) If T is a function type that has no cv- or ref- qualifier or an object type, provides a member typedef type which is T&. If T is an rvalue reference to some type U, then type is U&. Otherwise, type is T.



考虑例如:
using T = void() const; // Function type with const qualifier
using U = add_lvalue_reference<T>::type;

根据定义,我们应该有 U == T,但是如果我们没有第二个模板重载,那么此代码将导致编译时错误:

无法形成对cv或ref限定的函数类型的引用,因此 try_add_lvalue_reference的第一个模板重载被SFINAE淘汰了。

如果只有这种重载,则调用 detail::try_add_lvalue_reference<T>(0)会失败,因为没有可行的重载。

第二次重载不会尝试形成对const限定的函数类型的引用,因此始终可行,如果第一个不重载,则将选择该重载,返回类型本身。
int...参数确保可以使用 int参数调用这两个重载,并且 ...具有其他好处,即在重载解析中始终具有较低的优先级。因此,如果两个模板重载都是可行的,则将选择第一个,以在可能的情况下为类型提供左值引用。

关于c++ - add_lvalue_reference实现示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59446599/

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