¿Es legal usar funciones que devuelvan un temporal en las listas de iniciales

StackOverflow https://stackoverflow.com/questions/8898830

  •  29-10-2019
  •  | 
  •  

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top