自动和表达式模板

auto 也可能导致表达模板发挥作用的问题:

auto mult(int c) {
    return c * std::valarray<int>{1};
}

auto v = mult(3);
std::cout << v[0]; // some value that could be, but almost certainly is not, 3.

原因是 valarray 上的 operator*为你提供了一个代理对象,它将 valarray 称为懒惰评估的一种手段。通过使用 auto,你将创建一个悬空参考。而不是 mult 已经返回了 std::valarray<int>,那么代码肯定会打印 3。