Considere el siguiente código:C++ 11 vector push_back ambigua
#include <vector>
struct S { int a; double b; };
int main()
{
std::vector<S> v;
v.push_back({3, 4.5});
}
g ++ 4.4 se queja de que la llamada a push_back() es ambigua:
error: call of overloaded ‘push_back(<brace-enclosed initializer list>)’ is ambiguous
note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = S, _Alloc = std::allocator<S>]
note: void std::vector<_Tp, _Alloc>::push_back(_Tp&&) [with _Tp = S, _Alloc = std::allocator<S>]
Es éste supone que es ambigua según el estándar, o es solo un problema con g ++?
Sé que puede ser resuelto por la escritura en el tipo de forma explícita S:
v.push_back(S{3, 4.5});
pero el nombre del tipo de S puede ser largo, así que preferiría no hacerlo ...
Supongo que su compilador no tiene todas las nuevas implementaciones de referencia rvalue (mover o &&) completadas y una regla establecida sobre qué forma prefiere usar para ese temporal (debería tomar el móvil ya que su objeto es temporal) – David