声明/定义返回具有自动返回类型的 valarray 的函数时的隔离错误

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

本文关键字:valarray 函数 错误 隔离 返回类型 定义 返回 声明      更新时间:2023-10-16

有人可以帮助我理解为什么以下代码段错误吗? 如果我声明/定义mk以返回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使用表达式模板。 表达式模板不能很好地与返回类型推导配合使用。

在本例中,x*std::valarray<int>{1}返回一个表达式,该表达式显示"将x乘以某个std::valarray<int> 。 当您在 mk 之外使用该对象时,xstd::valarray<int>都已超出范围。

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

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

有一些建议添加与operator auto等效的东西 - 当您想要持久存储或返回类型的实例时应推导的类型 - 以使表达式模板更加透明。 如果这样的建议在哪里前进,那么表达式模板会以某种方式说"存储我作为valarray"。 我不知道这些建议的现状。