自动和表达式模板
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。