【发布时间】:2023-04-02 14:40:02
【问题描述】:
我有一个不可复制的 C++ lambda,它捕获了一个 unique_ptr,并且在使用 Apple Clang 作为 Objective-C++ 进行编译时的某些情况会导致 lambda 转换为块指针,此时由于尝试复制而导致编译失败的拉姆达。一个简单的例子如下:
int main(int argc, const char * argv[])
{
std::unique_ptr<int> myHeapInt = std::make_unique<int>(4);
int myStackInt = 0;
auto myLambda = [&, myHeapInt = std::move(myHeapInt)]()
{
myStackInt = *myHeapInt;
};
if(bool(myLambda)) //Error ar this point
{
*myHeapInt = 5;
}
std::invoke(myLambda);
return 0;
}
错误如下:
Call to implicitly-deleted copy constructor of 'const lambda...
Implicit capture of lambda object due to conversion to block pointer here
有没有办法绕过这种转换?
【问题讨论】:
-
为什么你认为你可以混合和匹配 C++ 和 Objective-C++?它们是不同的语言。
-
Apparently you can,但这看起来像纯 c++。
-
是的,我知道它们是不同的语言,我正在努力使两者都兼容。
-
Rajveer,混合两种语言不是一个好主意。使用“复制粘贴和调整”更容易制作和管理两个版本。 Dropbox 尝试为他们的移动应用程序编写基于 C++ 的代码(因此它可以在 iPhone 和 Android 上运行)并得出结论认为这是一个坏主意。现在他们只写了两个版本,一个是在 Kotlin 上为 Android 编写的,一个是为 Apple 编写的(使用它本机使用的任何语言...... Swift?)。
-
将 C++ 与 Objective-C 混合使用非常好,这就是 Objective-C++ 的本质。
标签: clang clang++ objective-c++