如何访问 Metal 内核中 C++ 引用或指针上的成员?

joh*_*ers 5 c++ gpu ios metal

当尝试实际使用任何地址空间(常量、设备或线程)的引用时,我总是遇到相同的错误。这不会编译,并给出一个奇怪的错误:

struct Foo {
    int getter() const {
        return 1;
    }
};

void use_foo(constant Foo& foo) {
    int x = foo.getter(); // error here
}

kernel void test_kernel(constant Foo& foo [[buffer(0)]]) {
    use_foo(foo);
}
Run Code Online (Sandbox Code Playgroud)

错误是:

无法使用“const const Foo”类型的表达式初始化“const Foo”类型的对象参数

替换constant为任何其他内存地址说明符,这是相同的一般错误。无论它是直接传递到内核的引用还是由函数创建的线程本地引用,都没关系——由于此错误,我实际上无法以任何方式使用这些引用。它们是 const 引用还是非常量引用也没有什么区别。

唯一的解决方法是只获取一个副本,Foo而不是尝试使用对其的引用。我一直不明白这个奇怪的错误。我也尝试过将论证视为constant const Foo&以及其他尝试和错误。

谁能建议如何实际使用参考文献?

如果我切换到使用指针而不是引用,我会收到类似的错误:

在此输入图像描述

由此:

struct Foo {
    int getter() const {
        return 1;
    }
};

void use_foo(constant const Foo* const foo) {
    int x = foo->getter(); // error here
}

kernel void test_kernel(constant Foo* foo [[buffer(0)]]) {
    use_foo(foo);
}
Run Code Online (Sandbox Code Playgroud)

在不同的地方尝试使用const或不使用类似的尝试没有什么区别。

jtb*_*des 4

您的成员函数的限定通常必须与被调用者对象的类型匹配。如果你想在对象上调用这样的方法const constant,你可以这样限定你的方法:

\n\n
    int getter() const constant {\n        return 1;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

金属着色语言规范规定 (\xc2\xa74):“任何作为指针或引用的变量都必须使用 [device、constant、thread、threadgroup 或 threadgroup_imageblock] 进行声明”。重要的是要理解this成员函数的参数是一个指针\xe2\x80\x94,基本上是一个不可见的函数参数\xe2\x80\x94,并且函数的限定会影响该指针的类型。实际上,您正在声明int getter(const constant Foo* this)

\n