C ++ 11 вектор push_back неоднозначный - PullRequest
17 голосов
/ 29 ноября 2010

Рассмотрим следующий код:

#include <vector>

struct S { int a; double b; };

int main()
{
    std::vector<S> v;
    v.push_back({3, 4.5});
}

g ++ 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 может быть длинным, поэтому я бы не стал этого делать ...

Ответы [ 2 ]

6 голосов
/ 29 ноября 2010

Должен ли S быть POD?Если нет, определите конструктор, и он должен работать.

struct S
{
    int a;
    double b;

public:

    S(int a, double b) : a(a), b(b) {}
};

Также v.push_back({3, 4.5}), вероятно, менее эффективен, чем v.emplace_back(3, 4.5).


Обновление : Пахнет как ошибка компилятора.Отлично работает с g ++ 4.6.0 20101025 (экспериментальный).

4 голосов
/ 12 декабря 2010

С последним черновиком (n3225) ваш код на самом деле неоднозначен.Кандидаты, которые находятся в векторе, будут

void push_back(const S& x);
void push_back(S&& x);

Вопрос в следующем: является ли инициализация списка из const S& a лучше / хуже последовательности преобразования инициализация списка S&&?Разрешение перегрузки сделает оба преобразования определяемыми пользователем последовательностями преобразования .Это означает, что они не сопоставимы, поскольку не существует правила, которое может это сделать.

Это обрабатывается основной проблемой # 1079 .Если эта проблема будет принята, предполагается, что ваш код вызывает второго кандидата.Кстати, Джейсон Меррил - разработчик GCC:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...