CTTCG 07 By Value or by Reference

传值:T

有 decay。

传左值引用:T &

注意遇到数组时可能需要 decay。

注意 T 类型可能是常量,导致 T & 其实是常引用。这样的参数不能被修改,因而不能作为传出参数。可以使用 concept 限定参数非常量:

传转发引用:T &&

这是 T 唯一可能匹配到引用类型的情况。如果 T 本身就是引用类型,就不能用它创建值类型的同类数据。解决方法有:① 用 type traits 去除引用属性 ② 使用 auto,因为 auto 默认不会匹配到引用。

std::refstd::cref

这两个模板函数返回的类型是 std::reference_wrapper<T>,这也是传值的一种,但有其特殊性。该模板类只提供了一个 get() 方法获得原引用和一个隐式转换成原引用的行为,即如果参数是 std::reference_wrapper<T>,就不能直接使用其成员(包括成员函数和成员运算符重载)。

C++ 标准库内置模板类对这种情况做出了处理:使用一个 type traits 去掉外层的 std::reference_wrapper 包装。但是这个 type trait 并没有提供给用户。