有一个名为xtensor的张量代数库。a * b + c
它具有特殊的语义:当您形成多个变量的表达式(如)时,您通常将它们std::move
或std::forward
它们放入该表达式中。当您在表达式中多次使用变量时,这样做的一种好方法(如官方文档中所述)是创建额外的 lambda 函数,该函数采用该变量并在内部多次使用它。显然你不能简单地写sin(std::move(A)) + cos(std::move(A))
。你必须写这样的东西:
template <class E>
inline auto sin_plus_cos(E&& e) noexcept
{
auto func = [](auto x) -> decltype(sin(x) + cos(x)) {
return sin(x) + cos(x);
};
return detail::make_lambda_function(std::move(func), std::forward<E>(e));
}
问题是这段代码在没有decltype
.
在xtensor的代码中,您可以找到注释:
auto
如果可能, lambda 函数会自动矢量化xsimd
(请注意,尾随-> decltype(...)
对于特征检测是必需的)。
我的问题是:为什么可能有必要以decltype
这样一种方式使用返回类型的自动扣除是不够的(或足够但不是特别有效)?
我不明白为什么decltype
必须在这种情况下使用。我不想在每个这样的函数中写两次相同的表达式。(decltype
如果我有多行带有临时变量的代码,该怎么办)