Если вы скомпилируете эту программу с помощью компилятора С++ 11, вектор не будет удален из функции.
#include <vector>
using namespace std;
vector<int> create(bool cond) {
vector<int> a(1);
vector<int> b(2);
return cond ? a : b;
}
int main() {
vector<int> v = create(true);
return 0;
}
Если вы возвращаете экземпляр, подобный этому, он перемещается.
if(cond) return a;
else return b;
Вот демон на ideone.
Я попробовал его с gcc 4.7.0 и MSVC10. Оба ведут себя одинаково.
Мое предположение, почему это происходит, это:
Тип тернарных операторов - это значение lvalue, потому что оно вычисляется до выполнения оператора return. На данный момент a и b еще не имеют значений x (скоро истечет).
Правильно ли это объяснение?
Является ли это дефектом в стандарте?
Это явно не предполагаемое поведение и очень распространенный случай, на мой взгляд.