我使用的是 c++14,auto 在 .cpp 文件上工作正常,但是当我尝试在我的类中创建通用 lambda 时,它会生成错误“此处不允许使用 Auto”
我做错了什么?
代码:
class MyClass{
private:
// Works
std::function<void(MyClass&)> assign = [&](MyClass& other){
//do something
};
// Does not work
std::function<void(auto)> assign = [&](auto other){
//do something
};
// Does not work
auto assign = [&](auto other){
//do something
};
};
最佳答案
您的两次尝试因不同原因而失败。我们先看第二个:
auto assign = [&](auto other){
//do something
};
这在理论上是可行的:lambda 表达式有一个可以推导和使用的明确类型。然而,如 this Q&A 中所述(对于 C++11 但仍然相关),该语言根本不允许 auto
成员变量,就是这样。
您的第一次尝试因更多与设计相关的原因而失败。好吧,眼前的问题是void(auto)
不是有效类型( auto
是具有定制语义的语法关键字,而不是类型),但是可以使用某些标记类型来创建 std::function<void(auto_t)>
有效的特化。
然而,问题是 std::function
是一个类型删除工具:它的目标是接收并隐藏一个 functionoid(例如 lambda),然后根据需要调用它。当进行调用时,functionoid 的类型不再已知,更不用说它的潜力了 operator()
模板——处理一般情况需要在运行时为未知的参数类型实例化该模板,这是不可能的。
底线:存储 lambda 在概念上是有效的,但不支持其类型推导,并且由于涉及模板,因此类型删除对于该作业来说是错误的工具。您唯一的解决方案是创建一个显式仿函数类,并将其用作成员:
class MyClass {
struct {
template <class T>
void operator()(T other) const {
// do something
}
} assign;
};
奖励点:C++20 允许在未计算的上下文中使用 lambda 以及默认可构造的 lambda,这意味着以下疯狂内容现在有效🙃
class MyClass {
decltype([](auto other) {
// do something
}) assign;
};
关于c++ - 对于头文件中的 lambda 类,此处不允许使用 Auto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64244226/