Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将constexpr值传递给采用const引用的CUDA设备端函数?_C++_C++11_Cuda_Constexpr_Const Reference - Fatal编程技术网

C++ 如何将constexpr值传递给采用const引用的CUDA设备端函数?

C++ 如何将constexpr值传递给采用const引用的CUDA设备端函数?,c++,c++11,cuda,constexpr,const-reference,C++,C++11,Cuda,Constexpr,Const Reference,考虑以下代码: template <typename T> __host__ __device__ int foo1(const T& x); template <typename T> __host__ __device__ int foo2(T x); 第一个函数可以,但第二个函数可以(GodBolt) 我不能同时提供这两个函数,因为编译器不能在它们之间做出决定(通常/总是)。我不想只传递值,因为我确实希望避免大型t的副本;或者因为某种形式的约束要求我提供f

考虑以下代码:

template <typename T> __host__ __device__ int foo1(const T& x);
template <typename T> __host__ __device__ int foo2(T x);
第一个函数可以,但第二个函数可以(GodBolt)

我不能同时提供这两个函数,因为编译器不能在它们之间做出决定(通常/总是)。我不想只传递值,因为我确实希望避免大型
t
的副本;或者因为某种形式的约束要求我提供
foo1()

那我能做什么呢


我还要提到,我希望能够在设备和主机端编写相同的代码。

您可以显式复制它,这样它就不会获取不存在的东西的地址:

返回foo(int{cci});
因此,取而代之的是新右值的地址。但这确实使设备端的代码有所不同

您还可以提供两个重载:

template\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
模板\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

因此,对于像
int

这样的琐碎类型,可以为您进行复制。目前,我使用以下难看的解决方法:

__device__ int baz() { return foo1(decltype(c){c}); }
这与@Artyer建议的类似,但也适用于模板化代码,因为您不需要指定
c
的类型,例如:

template <typename T>
__device__ int quux() { return function_taking_const_ref(decltype(c){c}); }
模板
__device_uu_uint qux(){返回函数u获取常数u ref(decltype(c){c})}
它还有另外一个好处,即不必知道
c
的类型。当然,这也可以在主机端代码中完成


然而,我真的不喜欢它!读者不会理解为什么需要它,并且会感到有些困惑。

我已经在使用该副本作为解决办法。我不喜欢这种重复的字体,但是——你会怎么做呢。关于SFINAE的分裂。。。可能存在非平凡的constexpr值,所以我对此不太确定。
template <typename T>
__device__ int quux() { return function_taking_const_ref(decltype(c){c}); }