Si compila este programa con un compilador C++ 11, el vector no se mueve fuera de la función.Resultado del operador ternario no es un valor
#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;
}
Si devuelve la instancia de esta manera, se mueve.
if(cond) return a;
else return b;
Aquí hay un demo on ideone.
Lo probé con gcc 4.7.0 y MSVC10. Ambos se comportan de la misma manera.
Supongo por qué sucede esto:
El tipo de operadores ternarios es un valor l porque se evalúa antes de que se ejecute la declaración de retorno. En este punto, a y b aún no son valores x (que expirarán pronto).
¿Es correcta esta explicación?
¿Es esto un defecto en el estándar?
Esto claramente no es el comportamiento previsto y un caso muy común en mi opinión.
"Si el segundo y tercer operandos son glvalues de la misma categoría de valor y tienen el mismo tipo, el resultado es de ese tipo y categoría de valor [...]" §5.16/4 – Mat
Ninguno de los dos ejemplos implica valores r o valores x. Pero es una pregunta interesante por qué se hace una copia en lugar de un movimiento. – aschepler