当 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=],x
和 std::valarray<int>
都超出了范围。
然后它会尝试使用这些对象(在它们过期后):在您的测试中,会产生段错误。经典的未定义行为。
它不会复制其参数,因为表达式模板通过避免这样做而变得高效。代价是auto
.
玩的不好
有一些建议添加等同于 operator auto
的东西——当你想持久存储时应该推导的类型,或者 return,一个类型的实例——使表达式模板更透明。如果这样的建议在哪里进行,那么表达式模板会以某种方式说 "store me a as a valarray
"。我不知道此类提案的当前状态。
有人可以帮我理解为什么以下代码会出现段错误吗?如果我 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=],x
和 std::valarray<int>
都超出了范围。
然后它会尝试使用这些对象(在它们过期后):在您的测试中,会产生段错误。经典的未定义行为。
它不会复制其参数,因为表达式模板通过避免这样做而变得高效。代价是auto
.
有一些建议添加等同于 operator auto
的东西——当你想持久存储时应该推导的类型,或者 return,一个类型的实例——使表达式模板更透明。如果这样的建议在哪里进行,那么表达式模板会以某种方式说 "store me a as a valarray
"。我不知道此类提案的当前状态。