gpt4 book ai didi

c++ - 使用受限函数时的尾随返回类型问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:12 27 4
gpt4 key购买 nike

我正在为内部使用 C++AMP 编写一个库,我发现以下内容不起作用,我很好奇为什么(因为如果我删除 restrict(amp),它会起作用> 来自仿函数):

template <typename T>
using SumType = decltype( std::declval<T>() + std::declval<T>() );

template <typename T, typename Func>
auto TestFunc(T t, Func f) -> SumType<decltype(f(t))>
{
return f(t) + f(t);
}

int main() {
auto f = []( float flVal ) restrict(amp) {
return flVal * flVal;
};

float flResult = TestFunc( 1.0f, f ); // Error here: "no instance of function template 'TestFunc' matches the argument list"
}

但是,如果我从 f 的定义中删除 restrict(amp),程序将按预期进行编译。 AMP 开放标准中是否有条款可以阐明这一点?


此外,如果我们在 TestFunc 的定义中使用以下内容,即使使用 restrict(amp) 说明符,它也能正确编译:

template <typename T, typename Func>
auto TestFunc( T t, Func f ) -> T
{
return f(t) + f(t);
}

最佳答案

我相信您想要的是 AMP Specification 的第 2.2 节.您收到错误消息“没有函数模板 'TestFunc' 的实例与参数列表匹配”,因为调用 TestFunc 的代码不在内部并且 restrict(amp) lambda(作为 parallel_for_each 的一部分。因此,编译器正在寻找带有 restrict(cpu) 装饰的 TestFunc。

如果您按如下方式更改声明,您的代码是否可以编译:

    auto f = [](float flVal) restrict(amp, cpu) {
return flVal * flVal;
};

在 AMP parallel_for_each 上下文之外调用 amp 限制函数/lambda 有点毫无意义,永远不会起作用。即使您可以欺骗编译器使其不出错。

关于c++ - 使用受限函数时的尾随返回类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475315/

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