Considere este tema como una secuela del siguiente tema:
Entrega anterior
Comportamiento indefinido y puntos de secuencia
Repasemos esta expresión divertida y complicada (las frases en cursiva se tomaron del tema anterior * sonrisa *):
i += ++i;
Decimos que esto invoca un comportamiento indefinido. Supongo que cuando digo esto, asumimos implícitamente que el tipo de i
es uno de los tipos integrados.
¿Qué pasa si el tipo de i
es un tipo definido por el usuario? Digamos que su tipo es el Index
que se define más adelante en esta publicación (ver más abajo). ¿Seguiría invocando un comportamiento indefinido?
¿Si es así por qué? ¿No es equivalente a escribir i.operator+=(i.operator++());
o incluso sintácticamente más simple i.add(i.inc());
? ¿O también invocan un comportamiento indefinido?
Si no, ¿por qué no? Después de todo, el objeto i
se modifica dos veces entre puntos de secuencia consecutivos. Recuerde la regla general: una expresión puede modificar el valor de un objeto solo una vez entre "puntos de secuencia consecutivos" . Y si i += ++i
es una expresión, debe invocar un comportamiento indefinido. Si es así, sus equivalentes i.operator+=(i.operator++());
y i.add(i.inc());
también debe invocar un comportamiento indefinido que parece ser falso! (hasta donde yo entiendo)
¿O i += ++i
no es una expresión para empezar? Si es así, ¿qué es y cuál es la definición de expresión ?
Si es una expresión y, al mismo tiempo, su comportamiento también está bien definido, entonces implica que el número de puntos de secuencia asociados con una expresión depende de alguna manera del tipo de operandos involucrados en la expresión. ¿Estoy en lo correcto (incluso en parte)?
Por cierto, ¿qué tal esta expresión?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
También debe considerar esto en su respuesta (si conoce su comportamiento con seguridad). :-)
Es
++++++i;
bien definido en C ++ 03? Después de todo, esto es esto
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};