CTTCG 07 By Value or by Reference
传值:T
有 decay。
传左值引用:T &
注意遇到数组时可能需要 decay。
注意 T
类型可能是常量,导致 T &
其实是常引用。这样的参数不能被修改,因而不能作为传出参数。可以使用 concept 限定参数非常量:
传转发引用:T &&
这是 T 唯一可能匹配到引用类型的情况。如果 T 本身就是引用类型,就不能用它创建值类型的同类数据。解决方法有:① 用 type traits 去除引用属性 ② 使用 auto,因为 auto 默认不会匹配到引用。
传 std::ref
和 std::cref
这两个模板函数返回的类型是 std::reference_wrapper<T>
,这也是传值的一种,但有其特殊性。该模板类只提供了一个 get() 方法获得原引用和一个隐式转换成原引用的行为,即如果参数是 std::reference_wrapper<T>
,就不能直接使用其成员(包括成员函数和成员运算符重载)。
C++ 标准库内置模板类对这种情况做出了处理:使用一个 type traits 去掉外层的 std::reference_wrapper
包装。但是这个 type trait 并没有提供给用户。