c++ - 对于头文件中的 lambda 类,此处不允许使用 Auto

标签 c++ c++14

我使用的是 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/

相关文章:

c++:使用X Macro在类中定义枚举和字符串数组?

c++ - 使用 C++ Python API 逐行执行 python 脚本

c++ - 更改保持原始指针指向其字段的对象的地址

c++ - C++可变参数包装到void **数组

C++:从类的公共(public)部分调用类中的私有(private)函数

c++ - 巨大的性能差异 : debug vs release

C++ 我应该做什么而不是全局变量?

C++ Visual Studio 2017 使用我的对象 vector 获取错误代码 C3867

c++ - std::shared_ptr<Parent> 到 std::shared_ptr<Child>

c++ - 如何在插入过程中更改插入的值?