Tenir compte le code suivant:C++ 11 vecteur push_back ambigu
#include <vector>
struct S { int a; double b; };
int main()
{
std::vector<S> v;
v.push_back({3, 4.5});
}
g ++ 4.4 se plaint que l'appel à push_back() est ambigu:
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>]
Est-ce censé être ambigu selon le standard, ou est-ce juste un problème avec g ++?
Je sais qu'il peut être résolu en écrivant dans le type de S explicitement:
v.push_back(S{3, 4.5});
mais le nom du type de S peut être long, donc je préfère ne pas le faire ...
Je suppose que votre compilateur n'a pas toutes les nouvelles implémentations de référence rvalue (move ou &&) terminées et un jeu de règles sur lequel le formulaire à utiliser pour ce temporaire (devrait prendre le mobile puisque votre objet est temporaire) – David