Следующий код компилируется в каждом компиляторе, который я пробовал (gcc 4.9.2, clang 3.6 и VS 2015). Однако VS 2013 обновляет 4 craps с ошибкой, которую я подробно рассмотрю ниже. Это ошибка в компиляторе?Оператор вызова константы, вызывающий связанную функцию non-const member
#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() будет константная функция член, но фиксирующее это не помогло.
это компилируется, если я изменить его на: 'станд :: функции г = зЬй :: Bind (& Foo :: DoFoo, это);' –
doqtor
@doqtor это интересно тин. Автоматическая дедукция идет с трудом. Я попробую и отчитаю. Благодаря! – ForeverLearning