Is this incorrect use of std::bind or a compiler bug?
I am using the latest snapshot build of clang with latest TDM-Gcc headers and libs. When compiling this (using -std=c++11 flag):
#include <functional>
#include <iostream>
class Foo
{
public:
void Bar(int x)
{
std::cout << x << std::endl;
}
};
int main()
{
Foo foo;
auto f = std::bind(&Foo::Bar, &foo, 5);
f();
return 0;
}
I get these errors:
In file included from Test.cpp:1:
C:DevEnvLLVM38libgccmingw325.1.0includec++functional:1426:7: error: static_assert failed "Wrong number of arguments for pointer-to-member"
static_assert(_Varargs::value
^ ~~~~~~~~~~~~~~~
C:DevEnvLLVM38libgccmingw325.1.0includec++functional:1440:7: note: in instantiation of template class 'std::_Bind_check_arity<void (Foo::*)(int) __attribute__((thiscall)), Foo *, int>' requested here
: _Bind_check_arity<typename decay<_Func>::type, _BoundArgs...>
^
C:DevEnvLLVM38libgccmingw325.1.0includec++functional:1461:5: note: in instantiation of template class 'std::_Bind_helper<false, void (Foo::*)(int) __attribute__((thiscall)), Foo *, int>' requested here
_Bind_helper<__is_socketlike<_Func>::value, _Func, _BoundArgs...>::type
^
Test.cpp:16:14: note: while substituting deduced template arguments into function template 'bind' [with _Func = void (Foo::*)(int) __attribute__((thiscall)), _BoundArgs = <Foo *, int>]
auto f = std::bind(&Foo::Bar, &foo, 5);
^
Test.cpp:16:14: error: no matching function for call to 'bind'
auto f = std::bind(&Foo::Bar, &foo, 5);
^~~~~~~~~
C:DevEnvLLVM38libgccmingw325.1.0includec++functional:1490:5: note: candidate template ignored: couldn't infer template argument '_Result'
bind(_Func&& __f, _BoundArgs&&... __args)
^
C:DevEnvLLVM38libgccmingw325.1.0includec++functional:1462:5: note: candidate template ignored: substitution failure [with _Func = void (Foo::*)(int) __attribute__((thiscall)), _BoundArgs = <Foo *, int>]
bind(_Func&& __f, _BoundArgs&&... __args)
^
2 errors generated.
Am i misusing std::bind or is this some weird compiler error? It seems to compile fine using just TDM Gcc.
This code is fine.
Unless you've done something weird or unsupported with your installation, your toolchain has a bug.
To me it looks like it's not considering the second argument to std::bind
to be the "this pointer", and thinks you're actually passing two arguments to Foo::Bar
(which you're not), which you can't.
The next step is to raise this with the maintainers of your toolchain.
See https://llvm.org/bugs/show_bug.cgi?id=24372.
链接地址: http://www.djcxy.com/p/87456.html上一篇: 编程Cortana