声明/定义返回具有自动返回类型的 valarray 的函数时的隔离错误
Segfaults when declare/define a function returning a valarray with auto return type
有人可以帮助我理解为什么以下代码段错误吗? 如果我声明/定义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
之外使用该对象时,x
和std::valarray<int>
都已超出范围。
然后,它会尝试使用这些对象(在它们过期后(:在您的测试中,会导致段错误。 经典的未定义行为。
它不会复制其参数,因为表达式模板通过避免这样做而有效。 代价是他们玩得不好 auto
.
有一些建议添加与operator auto
等效的东西 - 当您想要持久存储或返回类型的实例时应推导的类型 - 以使表达式模板更加透明。 如果这样的建议在哪里前进,那么表达式模板会以某种方式说"存储我作为valarray
"。 我不知道这些建议的现状。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 为什么std::vector和std::valarray初始化构造函数不同
- 声明/定义返回具有自动返回类型的 valarray 的函数时的隔离错误
- 为什么valarray在c++ 03中没有像vector那样的交换函数