У меня есть эта функция...
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 принять векторный объект и принять неэффективность?
Каков наилучший способ сделать это?
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.