gpt4 book ai didi

c++ - 声明/定义返回具有自动返回类型的 valarray 的函数时的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:56 25 4
gpt4 key购买 nike

有人可以帮我理解为什么以下代码会出现段错误吗?如果我声明/定义 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”。我不知道此类提案的当前状态。

关于c++ - 声明/定义返回具有自动返回类型的 valarray 的函数时的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28864003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com