È legale utilizzare le funzioni che restituiscono un temporaneo negli elenchi di iniziative

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

  •  29-10-2019
  •  | 
  •  

Domanda

Ho il seguente costruttore di un oggetto

Segment::Segment(QPointF const& start, QPointF const& end):
  mOrigin(toVector3df(start)),mEnd(toVector3df(end)){    
}

mOrigin è di tipo Vector3df e la funzione toVector3df(QPointF const&) Restituisce un temporaneo Vector3df. Fin qui tutto bene. Il codice compila bene e funziona come un fascino sotto Linux, GCC 4.4.3. La maggior parte degli avvertimenti attivati.

Ora volevo incrociare lo stesso codice per uno smartphone Nokia (Meamo Fremantle) e all'improvviso ottengo avvisi di compilatore molto strani:

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

Innanzitutto: ovviamente non esiste una vera variabile chiamata questo.902 all'interno di 'vecto3df' quindi la mia prima domanda sarebbe: "Qualcuno ha visto qualche avvertimento come questo?" Inoltre non c'è niente di sbagliato in Vector3df costruttori, sono molto semplici e toVector3df(QPointF const&) è una funzione modello non membro del rivestimento che funziona perfettamente in altre parti del codice.Vector3df eredita da un modello che definisce solo funzioni non membri, nessuna variabile no, funzioni virtuali.

Secondo, quando cambio il codice sopra in quanto segue

Segment::Segment(QPointF const& start, QPointF const& end):
  mOrigin(),mEnd(){
  mOrigin = toVector3df(start);
  mEnd = toVector3df(end);
}

Il codice funziona bene senza avvertimenti. Allora cosa mi manca qui? Qualcuno ha un'idea di quale potrebbe essere l'origine degli avvertimenti. Sto violando un po 'di dottrina di cui non sono a conoscenza. Il compilatore Fremantle (Maemo 5, Qt 4.6.2) è più grave o buggy?

Grazie in anticipo, Martin

EDIT: ecco un esempio minimo, ci scusiamo per la lunghezza :-

#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;
}

Chiamata del compilatore:

 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

L'eredità del modello sembra essere cruciale, se il Vector3D non eredita tutto funziona bene.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top