¿Es legal usar funciones que devuelvan un temporal en las listas de iniciales
Pregunta
Tengo el siguiente constructor de un objeto
Segment::Segment(QPointF const& start, QPointF const& end):
mOrigin(toVector3df(start)),mEnd(toVector3df(end)){
}
mOrigin
es de tipo Vector3df
y la función toVector3df(QPointF const&)
Devuelve un temporal Vector3df
. Hasta aquí todo bien. El código se compila bien y funciona como un encanto en Linux, GCC 4.4.3. La mayoría de las advertencias activadas.
Ahora quería compilar el mismo código para un teléfono inteligente Nokia (moamo Fremantle) y de repente obtengo advertencias de compiladores muy extrañas:
include/vector3d.h: In constructor 'Segment::Segment(const QPointF&, const QPointF&)':
include/vector3d.h:64: warning: 'this.902' is used uninitialized in this function
include/vector3d.h:64: note: 'this.902' was declared here
Primero: Por supuesto, no hay una variable real llamada esto.902 dentro de 'vecto3df', así que mi primera pregunta sería: "¿Alguien ha visto alguna advertencia como esta?" Además, no hay nada de malo en Vector3df
constructores, son muy simples y toVector3df(QPointF const&)
es una función de plantilla no miembro que funciona perfecta en otras partes del código.Vector3df
hereda de una plantilla que solo define las funciones no miembros, no hay variables no, funciones virtuales.
Segundo, cuando cambio el código anterior a lo siguiente
Segment::Segment(QPointF const& start, QPointF const& end):
mOrigin(),mEnd(){
mOrigin = toVector3df(start);
mEnd = toVector3df(end);
}
El código funciona bien sin advertencias. Entonces, ¿qué me estoy perdiendo aquí? ¿Alguien tiene una idea de cuál podría ser el origen de las advertencias? ¿Estoy violando alguna doctrina que no soy consciente? ¿El compilador Fremantle (Maemo 5, Qt 4.6.2) es más severo o buggy?
Gracias de antemano, Martin
EDITAR: Aquí hay un ejemplo mínimo, perdón por la longitud:-P
#include <iostream>
#include <sstream>
#include <QPoint>
template<typename T> class IoEnabled {};
template<typename T>
class Vector3d: public IoEnabled<Vector3d<T> > {
private:
T mX; T mY; T mZ;
public:
Vector3d(T const& x, T const& y, T const& z=0.0) : mX(x), mY(y), mZ(z) {}
};
typedef Vector3d<float> Vector3df;
template<class T>
Vector3df toVector3df(T const& p){
return Vector3df(p.x(),p.y(),0.0);
}
class Segment {
private:
Vector3df mOrigin; Vector3df mEnd;
public:
Segment(QPointF const& start, QPointF const& end):
mOrigin(toVector3df(start)),mEnd(toVector3df(end)){
//if toVector3df(...) is moved from the initializer to the body it works
}
};
int main(int argc, char **argv) {
(void) argc; (void) argv;
Segment temp(QPointF(1,2),QPointF(3,4));
return 0;
}
Llamada del compilador:
g++ -c -pipe -Werror -Wall -Wextra -Wunused -Wundef -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -D_REENTRANT -Wall -W -DQT_GL_NO_SCISSOR_TEST -DQT_DEFAULT_TEXTURE_GLYPH_CACHE_WIDTH=1024 -DMAEMO -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/share/qt4/mkspecs/linux-g++-maemo5 -I. -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/include/QtCore -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/include/QtGui -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/include -Isrc -Irelease/moc -o release/obj/main.o src/main.cpp
La herencia de la plantilla parece ser crucial, si el Vector3D no herede todo funciona bien.
No hay solución correcta