pop_back - C++ 11 vector push_back ambiguo
push_back c++ que es (2)
¿ S
tiene que ser un POD? Si no, defina un constructor, y debería funcionar.
struct S
{
int a;
double b;
public:
S(int a, double b) : a(a), b(b) {}
};
Además, v.push_back({3, 4.5})
es probablemente menos eficiente que v.emplace_back(3, 4.5)
.
Actualización : huele como un error de compilación. Funciona perfectamente bien con g ++ 4.6.0 20101025 (experimental).
Considere el siguiente código:
#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>]
¿Se supone que esto es ambiguo según el Estándar, o es solo un problema con g ++?
Sé que se puede resolver escribiendo explícitamente el tipo de S:
v.push_back(S{3, 4.5});
pero el nombre tipográfico de S puede ser largo, así que prefiero no hacer eso ...
Con el borrador más reciente (n3225), su código es de hecho ambiguo. Los candidatos que estén en vector serán
void push_back(const S& x);
void push_back(S&& x);
La pregunta es: ¿es una inicialización de lista de una secuencia de conversión mejor y peor que una inicialización de lista de una S&&
? La resolución de sobrecarga hará que ambas conversiones sean secuencias de conversión definidas por el usuario . Esto significa que no son comparables porque no hay una regla que pueda hacerlo.
Esto es manejado por el problema central # 1079 . Si ese problema se acepta, la intención es que su código llame al segundo candidato. Por cierto, Jason Merril es un desarrollador de GCC :)