当前位置: 首页 > 知识库问答 >
问题:

丢弃限定符未知原因(std::bind()/lambda)

邹博明
2023-03-14

我不明白资格赛在哪里/为什么会被淘汰。

#include <iostream>
#include <memory>

class A {
public:
    void f() {};
};

template <typename Callable>
void invoker(Callable c) {
    auto l = [=]() {
        c(); // <------------------- Error
    };
    l();
}

int main() {
    A a;
    invoker(std::bind(&A::f, a));
    return 0;
}

我在c()上得到一个编译器错误;生产线:

错误:传递“const std::\u Bind(A)

解决方法我不明白:

>

  • 将A::f()定义为const:void f()const{};

    bind()对实例a的引用:调用者(std::bind(

    通过以下方式传递到lambda:自动l=[

    g版本:

    g++ --version
    g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
    
  • 共有2个答案

    邢良才
    2023-03-14

    霍尔特的回答很好。

    如果不能将a::f修改为常量方法,则可以使lambda可变:

    #include <iostream>
    #include <memory>
    #include <functional>
    
    class A {
    public:
        void f() {};
    };
    
    template <typename Callable>
    void invoker(Callable c) {
        auto l = [=]() mutable // <-- Fixed
        {
            c(); 
        };
        l();
    }
    
    int main() {
        A a;
        invoker(std::bind(&A::f, a));
        return 0;
    }
    
    云凌
    2023-03-14

    据此:

    std::bind的返回类型包含std::decay类型的成员对象

    这意味着c持有a的副本(我们称之为c.a),但由于您是通过副本捕获c,因此c在lambda中是限定的,调用

    • 通过生成成员函数,可以在对象上调用它

    额外的细节(仍然来自这里):

    如果存储的参数arg的类型是std::reference_wrapper

    因此,使用std::ref(a)调用相当于:

    std::invoke(&A::f, std::forward<A&>(c_a.get()));
    

    其中,c\U a是std::reference\U包装

    否则,普通存储的参数arg作为左值参数传递给可调用对象:上面调用std::invoke中的参数vn是简单的arg,相应的类型vn是cv

    因此,原始调用等效于(因为c是常量,所以cv是常量):

    std::invoke(&A::f, std::forward<A const&>(c_a));
    

    其中,c\U a是c中a的副本。

     类似资料:
    • 我有一个类缓存,它的函数write指定为 我这样调用这个函数。 上面的一行给了我以下错误 将“const Cache”作为“bool Cache::write(const MemoryAccess)”的“this”参数传递 this参数是特定于编译器的,它有助于代码混乱和中断本地命名空间变量优先级。但这样的变量并没有在这里传递。

    • 在gcc 5.4.0上,从const C std::map获取条目时无法编译。 这看起来类似于传递“const”。此参数丢弃限定符[-fppermissive],它是关于

    • 下面是一个基本的代码片段,我得到了一个错误: 错误:传递'constd::map 注意:我知道我可以在不使用的情况下删除点,但上面的代码片段只是一个更大问题的示例。 我检查了一些关于类似错误的问题: 错误:传递constd::映射 但在这两种情况下,都是因为被声明为。另一方面,我试图使用/访问的

    • 标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int

    • 以下代码在Green Hills C编译器中导致错误(错误:类型int*与参数类型const int*不兼容),而它只产生警告并使用gcc进行编译(警告:传递func的参数1会从指针目标类型中丢弃const限定符)。 哪些行为符合C标准?

    • 我有一个定义如下的类。h: 输出流函数有问题。在cpp文件中,我将其定义为: 下面是std'const错误:, 错误:传递“const std::map,std::vector” 当我从ostream操作符重载的定义中删除const保护时,这个编译很好,但是,我相信我应该能够使用const保护来完成它,根据我的老师的说法,现在养成这个习惯是更好的做法。有谁能给我指点一下为什么这本书不能编译? 不过