【发布时间】:2019-12-22 17:41:24
【问题描述】:
在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?在什么情况下会调用它来代替第一个?
【问题讨论】:
-
不是一个完整的答案,但我认为这是在玩重载优先级,因此当需要添加引用时,第一个
try_add_lvalue_reference将是首选。请注意,libc++ 实现是somewhat different。 -
我认为它只是表面上看起来不同。它使用隐藏在实现背后的函数a similar set。
-
你是对的......