一种解决方案是使用引用折叠和std::forward。即在定义auto时使用std::forward进行引用折叠,以保留原有类型的引用属性。示例如下:
#include
template
void func(T&& arg) {
auto&& ref = std::forward(arg);
std::cout << std::is_lvalue_reference::value << '\n';
}
int main() {
int i = 42;
func(i); // 1
func(42); // 0
return 0;
}
以上代码中,引用属性会被保留,输入结果为1和0。这样做可以在保持auto简洁性的同时避免auto推导时丢失引用属性的问题。