std :: add_lvalue_reference和std :: add_rvalue_reference的目的是什么?

gez*_*eza 9 c++

std::add_lvalue_reference和的目的是std::add_rvalue_reference什么?

似乎使用T &/可以T &&做到这一点,因为它可以成功编译:

#include <utility>

int main() {
    { using T = int;    static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };
    { using T = int &;  static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };
    { using T = int &&; static_assert(std::is_same_v<std::add_lvalue_reference_t<T>, T &>); };

    { using T = int;    static_assert(std::is_same_v<std::add_rvalue_reference_t<T>, T &&>); };
    { using T = int &;  static_assert(std::is_same_v<std::add_rvalue_reference_t<T>, T &&>); };
    { using T = int &&; static_assert(std::is_same_v<std::add_rvalue_reference_t<T>, T &&>); };
}
Run Code Online (Sandbox Code Playgroud)

L. *_* F. 6

void&格式不正确。 std::add_lvalue_reference<void>void

通常,add_lvalue_reference如果不可能,则不添加对类型的引用。每[meta.trans.ref]

template <class T>
struct add_­lvalue_­reference;
Run Code Online (Sandbox Code Playgroud)

如果T命名为可引用类型,则成员typedef type命名为 T&;否则,type名称T。[  注意:此规则反映了引用折叠([dcl.ref])的语义。—  尾注  ]

什么是可引用类型?根据[defns.referenceable],可引用类型为

对象类型,没有cv限定符或ref限定符的函数类型或引用类型[  注意:该术语描述了可以创建引用的类型,包括引用类型。—  尾注  ]