使用GCC 4.7.0(g ++ -std = c ++ 0x test.cpp)编译以下简单的C ++代码会产生编译错误消息:错误:无法从'&amp ;;中推断'auto' std :: vector< _Tp,_Alloc> :: push_back>'
我的问题是为什么在这个简单的情况下 auto 无法推断成员函数指针的类型?
FragmentTabHost
答案 0 :(得分:9)
C ++ 11为vector::push_back
添加了一个带有rvalue参数的重载。 mem_fn
无法推断出您希望获取地址的两个重载中的哪一个,因此您需要添加一个转换来消除歧义。
auto pbb = std::mem_fn(static_cast<void (vector<int>::*)(const vector<int>::value_type&)>(&vector<int>::push_back));
请注意,应尽可能避免在标准库中获取类的成员函数的地址。允许实现添加额外的重载,带有默认参数的参数等,这将使代码不可移植。
§17.6.5.5/ 2 [member.functions]
对于C ++标准库中描述的非虚拟成员函数,实现可以声明一组不同的成员函数签名,前提是对成员函数的任何调用都将从此处描述的声明集中选择一个重载。标准的行为就像选择了过载一样。 [注意:例如,实现可以使用默认值添加参数,或者使用具有两个或更多具有等效行为的成员函数的默认参数替换成员函数,或者 为成员函数名称添加其他签名。 -end note ]
答案 1 :(得分:3)
您需要提供一个类型参数来清除重载:
std::mem_fn<void(const int&)>(&vector<int>::push_back);
或者
std::mem_fn<void(int&&)>(&vector<int>::push_back);