1

有一个名为xtensor的张量代数库。a * b + c它具有特殊的语义:当您形成多个变量的表达式(如)时,您通常将它们std::movestd::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如果我有多行带有临时变量的代码,该怎么办)

4

0 回答 0