当 declare/define 函数 return 使用 auto return 类型的 valarray 时出现段错误

Segfaults when declare/define a function returning a valarray with auto return type

有人可以帮我理解为什么以下代码会出现段错误吗?如果我 declare/define mk 到 return std::valarray<int>,则代码有效。我想我不太确定 auto 在这里做什么。

#include <iostream>
#include <valarray>
auto mk(int x)
{
    return x * std::valarray<int>{1};
}
int main()
{
    auto v = mk(3);
    std::cout << v[0] << std::endl;
    return EXIT_SUCCESS;
}

std::valarray 使用表达式模板。表达式模板不能很好地处理 return 类型推导。

在这种情况下,x*std::valarray<int>{1} return 是一个表示“将 x 乘以一些 std::valarray<int> 的表达式。当您使用 [= 之外的对象时14=],xstd::valarray<int> 都超出了范围。

然后它会尝试使用这些对象(在它们过期后):在您的测试中,会产生段错误。经典的未定义行为。

它不会复制其参数,因为表达式模板通过避免这样做而变得高效。代价是auto.

玩的不好

有一些建议添加等同于 operator auto 的东西——当你想持久存储时应该推导的类型,或者 return,一个类型的实例——使表达式模板更透明。如果这样的建议在哪里进行,那么表达式模板会以某种方式说 "store me a as a valarray"。我不知道此类提案的当前状态。