为什么 - 在具有扩展 lambda 的示例中 - 是一个模棱两可的复制构造函数和一些已删除的函数

Why - in that example with an extended lambda - is an ambigious copy constructor and some deleted function

提问人:tommsch 提问时间:7/26/2023 最后编辑:tommsch 更新时间:7/26/2023 访问量:78

问:

我不明白以下代码的行为:

template< bool b >
struct Foo {
  Foo() = default;
  __host__   Foo( const Foo & ) requires(  b ) {}
  __device__ Foo( const Foo & ) requires( !b ) {}  
};

template< typename Lambda >
__global__
void kernel( Lambda ) {}

int main() {
  Foo< true > foo;
  auto la = [foo] __device__ (){ };
  kernel<<< 1, 1 >>>( la );
}

当我使用 nvcc 12.1 和 gcc 11.3 作为主机编译器 () 编译它时,我收到两个错误nvcc main.cu -std=c++20 --expt-extended-lambda

  • copy constructor for class "Foo<true>" is ambiguous
        auto la = [foo] __attribute__((device)) (){ };
                   ^
    
  • function "lambda []()->void::<unnamed>(const lambda []()->void &)"
    (declared implicitly) cannot be referenced -- it is a deleted function
        kernel<<< 1, 1 >>>( la );
                            ^
    

我不明白这两个错误。

  • 为什么复制 ctor 模棱两可?
  • 哪个函数被删除了,编译器希望在什么位置使用它?
C++ lambda cuda 复制构造函数 deleted-functions

评论


答: 暂无答案