Не удается передать вектор, возвращенный из функции, функции, ожидающей ссылку на метод

0

У меня есть эта функция...

std::vector<int> GetAVector();

используется в качестве аргумента для этой функции:

void ExpectingAVector(std::vector<int> &vec);

Итак, эта конструкция:

ExpectingAVector(GetAVector());

Скомпилируется на Visual Studio 2012, но НЕ компилируется на G++, Eclipse Indigo, Ubuntu 12.04

Сообщение об ошибке: примечание: неизвестное преобразование для аргумента 1 из 'std :: vector to' std :: vector &

Поэтому, если G++ не может это подтвердить, каковы мои варианты? Все возможные альтернативы менее элегантны

а) объявить вектор и передать его по ссылке как на GetAVector, так и на ExpectingAVector?
б) есть ли GetAVector вернуть указатель на вектор и есть ли ExpectingAVector принять его? Мессорная очистка
c) есть ли ExpectingAVector принять векторный объект и принять неэффективность?

Каков наилучший способ сделать это?

  • 1
    Вау, это действительно компилируется в VS2012? Это определенно не разрешено стандартом и таким базовым правилом, я бы никогда не подумал, что какой-нибудь наполовину приличный компилятор может ошибиться!
Теги:
stl
visual-studio-2012
ubuntu-12.04

1 ответ

2
Лучший ответ
ExpectingAVector( GetAVector() );
                  |
                  +-------------Creates a temporary vector<int> object (rvalue)

Использование:

void ExpectingAVector(const std::vector<int> &vec);

временный объект не может связываться с неконстантными ссылками

Это расширение на Visual C++, чтобы разрешить такое поведение, которое может быть отключено некоторым флагом (я не знаю, какие из них)

Вы также можете использовать move-semantics с void ExpectingAVector(std::vector<int> &&vec ) { } если вы в порядке с C++ 11.

  • 0
    Прекрасный ясный ответ :) Так что мои единственные "однострочные" варианты - это семантика перемещения?
  • 0
    @AndrewS. и да и нет. Вы можете сделать с временными, но не можете связать lvalues тогда
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню