gpt4 book ai didi

c++ - const 调用运算符调用绑定(bind)的非常量成员函数

转载 作者:行者123 更新时间:2023-11-30 05:43:18 27 4
gpt4 key购买 nike

以下代码在我尝试过的每个编译器(gcc 4.9.2、clang 3.6 和 VS 2015)上都能正常编译。但是 VS 2013 更新 4 出现错误,我将在下面详细说明。这是编译器中的错误吗?

#include <iostream>
#include <functional>

template<typename Func>
struct Bar
{
Func f_;
Bar(Func f) : f_(f) { }
void operator()() const
{
f_();
}
};

template<typename T>
void Baz(T const& t)
{
Bar<T> b(t);
b();
}

struct Foo
{
Foo()
{
auto r = std::bind(&Foo::DoFoo, this);
Baz(r);
}
void DoFoo() { std::cout << "Doing Foo!\n"; }
};

int main()
{
Foo f;
return 0;
}

错误列表如下:

1>doodle.cpp(15): error C3848: expression having type 'const std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >' would lose some const-volatile qualifiers in order to call 'void std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >::operator ()<>(void)'
1> doodle.cpp(14) : while compiling class template member function 'void Bar<T>::operator ()(void) const'
1> with
1> [
1> T=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >
1> ]
1> doodle.cpp(23) : see reference to function template instantiation 'void Bar<T>::operator ()(void) const' being compiled
1> with
1> [
1> T=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >
1> ]
1> doodle.cpp(22) : see reference to class template instantiation 'Bar<T>' being compiled
1> with
1> [
1> T=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >
1> ]
1> doodle.cpp(31) : see reference to function template instantiation 'void Baz<std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >>(const T &)' being compiled
1> with
1> [
1> T=std::_Bind<true,void,std::_Pmf_wrap<void (__thiscall Foo::* )(void),void,Foo,>,Foo *const >
1> ]

我认为它希望 DoFoo() 成为一个 const 成员函数,但修复它并没有帮助。

最佳答案

这似乎是一个 VS2013 编译器错误,有两种方法可以解决它:

使用 std::function 而不是 auto 来存储对成员函数的调用

std::function<void()> r = std::bind(&Foo::DoFoo, this);

或者从 Bar 中的函数调用 operator() 中移除 const

template<typename Func>
struct Bar
{
Func f_;
Bar(Func f) : f_(f) { }
void operator()() // const
{
f_();
}
};

关于c++ - const 调用运算符调用绑定(bind)的非常量成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30277539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com