Рассмотрим следующий код:C++ 11 вектор push_back неоднозначным
#include <vector>
struct S { int a; double b; };
int main()
{
std::vector<S> v;
v.push_back({3, 4.5});
}
г ++ 4.4 жалуется, что вызов push_back() неоднозначен:
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>]
Это должно быть неоднозначным в соответствии с Стандарт, или это просто проблема с g ++?
Я знаю, что это может быть решена путем записи в типе S явно:
v.push_back(S{3, 4.5});
но имя типа S может быть долгим, поэтому я предпочел бы не делать этого ...
Я предполагаю, что ваш компилятор не имеет всех новых реализаций ссылок (move или &&) и правила, установленные в какой форме предпочитают использовать для этого временного (например, должен взять подвижный, так как ваш объект является временным) – David 2010-11-29 00:58:37