转发引用只应作为 std::forward 的参数
8.8 ID_illForwardingReference
不应混淆“转发引用(forwarding references)”与右值引用,除作为 std::forward 的参数之外,不应对转发引用再有任何操作。
转发引用是类型为 T&& 的参数,T 为函数模板类型,无论左值还是右值均可被这种参数接受,而且 const、volatile 等属性也会被忽略,由于含有不确定的状态,所以直接操作转发引用是不妥的,只应通过 std::forward<T> 交由合适的接口处理。
示例:
int func();
int func(int&);
int func(const int&);
template <class T>
int wrapper(T&& arg) {
return func(arg); // Non-compliant
}
template <class... V>
int wrapper(V&&... args) {
return func(args...); // Non-compliant
}
例中 arg 和 args 为转发引用及相关参数包,不经 std::forward 的转换直接作为接口的参数无法正确选择重载的接口,应改为:
template <class T>
int wrapper(T&& arg) {
return func(forward<T>(arg)); // Compliant
}
template <class... V>
int wrapper(V&&... args) {
return func(forward<V>(args)...); // Compliant
}
相关
依据
ISO/IEC 14882:2011 20.2.3(1)
ISO/IEC 14882:2017 23.2.5(1)