C++ 添加左值参考实现示例

C++ 添加左值参考实现示例,c++,c++11,std,C++,C++11,Std,在查找上的std::add_lvalue_reference时,可以看到以下实现示例: 名称空间详细信息{ 模板 结构类型_标识{using type=T;};//或使用std::type_标识(从C++20开始) 模板 自动尝试添加左值参考(int)->输入标识; 模板 自动尝试添加左值引用(…)->类型标识; }//名称空间详细信息 模板 struct add_lvalue_reference:decltype(detail::try_add_lvalue_reference(0)){};

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

名称空间详细信息{
模板
结构类型_标识{using type=T;};//或使用std::type_标识(从C++20开始)
模板
自动尝试添加左值参考(int)->输入标识;
模板
自动尝试添加左值引用(…)->类型标识;
}//名称空间详细信息
模板
struct add_lvalue_reference:decltype(detail::try_add_lvalue_reference(0)){};

为什么需要第二个
try\u add\u lvalue\u reference
,在哪些情况下会调用它来代替第一个引用?

第二个重载处理以下定义中的“否则”条件:

1) 如果T是一个没有cv或ref限定符或对象类型的函数类型,则提供一个成员类型定义类型,即T&。如果T是某个类型U的右值引用,则类型为U&。否则,类型为T

例如,考虑:

using T = void() const; // Function type with const qualifier
using U = add_lvalue_reference<T>::type;
使用T=void()常量;//带有常量限定符的函数类型
使用U=add\U lvalue\U reference::type;
根据定义,我们应该有
U==T
,但是如果没有第二个模板重载,那么此代码将导致编译时错误:

不可能形成对cv或ref限定函数类型的引用,因此
try\u add\u lvalue\u reference
的第一个模板重载被取消

如果只有该重载,则调用
detail::try\u add\u lvalue\u reference(0)
hard会失败,因为没有可行的重载

第二个重载并不试图形成对const限定函数类型的引用,因此总是可行的,如果第一个重载不可行,将选择它,并返回类型本身


int
..
参数确保可以使用
int
参数调用这两个重载,
..
还有一个额外的好处,即它在重载解析中总是具有较低的优先级。因此,如果两个模板重载都是可行的,那么将选择第一个来提供类型,并在可能的情况下添加左值引用。

这不是一个很好的答案,但我认为这是在玩弄重载优先级,因此当需要添加引用时,首选第一个
try\u add\u左值\u reference
。请注意,libc++实现非常简单。我认为它只是表面上看起来有所不同。它使用了隐藏在实现后面的函数。没错……在尝试派生
try\u add\u lvalue\u reference
helper函数的行为时,我完全忽略了函数类型。这就更清楚了。