การใช้ฟังก์ชันส่งคืนรายการชั่วคราวในรายการเริ่มต้นถูกกฎหมายหรือไม่

ฉันมีตัวสร้างวัตถุดังต่อไปนี้

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

mOrigin เป็นประเภท Vector3df และฟังก์ชัน toVector3df(QPointF const&) ส่งคืน Vector3df ชั่วคราว จนถึงตอนนี้ดีมาก โค้ดนี้คอมไพล์ได้ดีและใช้งานได้ดีภายใต้ linux, gcc 4.4.3 คำเตือนส่วนใหญ่เปิดใช้งานแล้ว

ตอนนี้ฉันต้องการคอมไพล์โค้ดเดียวกันสำหรับสมาร์ทโฟน Nokia (Meamo Fremantle) และทันใดนั้นฉันก็ได้รับคำเตือนจากคอมไพเลอร์แปลก ๆ :

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

อันดับแรก: แน่นอนว่าไม่มีตัวแปรจริงที่เรียกว่า this.902 ภายใน 'Vecto3df' ดังนั้นคำถามแรกของฉันคือ: "มีใครเห็นคำเตือนแบบนี้บ้างไหม?" นอกจากนี้ยังไม่มีอะไรผิดปกติกับตัวสร้าง Vector3df พวกมันเรียบง่ายมากและ toVector3df(QPointF const&) เป็นฟังก์ชันเทมเพลตที่ไม่ใช่สมาชิกซับเดียวที่ทำงานอย่างสมบูรณ์แบบในส่วนอื่น ๆ ของโค้ด Vector3df สืบทอดมาจากเทมเพลตที่กำหนดเฉพาะฟังก์ชันที่ไม่ใช่สมาชิก ไม่มีตัวแปร ไม่ใช่ ฟังก์ชันเสมือน

ประการที่สอง เมื่อฉันเปลี่ยนโค้ดด้านบนเป็นโค้ดต่อไปนี้

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

รหัสทำงานได้ดีโดยไม่มีคำเตือนใด ๆ แล้วฉันพลาดอะไรไปที่นี่? มีใครมีความคิดว่าที่มาของคำเตือนอาจเป็นเช่นไร ฉันกำลังละเมิดหลักคำสอนบางอย่างที่ฉันไม่รู้หรือไม่ คอมไพเลอร์ fremantle (Maemo 5, Qt 4.6.2) รุนแรงกว่าหรือมีข้อบกพร่องหรือไม่?

ขอบคุณล่วงหน้ามาร์ติน

แก้ไข: นี่เป็นตัวอย่างเล็กน้อย ขออภัยในความยาว :-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;
}

โทรคอมไพเลอร์:

 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

การสืบทอดเทมเพลตดูเหมือนจะมีความสำคัญ หาก Vector3d ไม่สืบทอดทุกอย่างก็ทำงานได้ดี


person Martin    schedule 17.01.2012    source แหล่งที่มา
comment
toVector3df เป็นฟังก์ชันสมาชิกใช่หรือไม่   -  person Seth Carnegie    schedule 17.01.2012
comment
ไม่มีเทมเพลตที่ไม่ใช่สมาชิก   -  person Martin    schedule 17.01.2012
comment
คุณสามารถทำซ้ำสิ่งนี้ด้วยตัวอย่างเล็ก ๆ ที่คุณสามารถวางลงในคำถามได้หรือไม่?   -  person Mark B    schedule 17.01.2012
comment
@Mark: เสร็จแล้ว ตัวเลือก Comiler ดูเหมือนสำคัญ หากไม่มี -O3 และบางส่วนก็คอมไพล์   -  person Martin    schedule 17.01.2012


คำตอบ (1)


ไม่มีอะไรผิดในการใช้ฟังก์ชันส่งคืนรายการชั่วคราวในรายการตัวเริ่มต้นสมาชิก
แม้แต่ลำดับที่สมาชิกจะเริ่มต้นก็ถูกกำหนดไว้อย่างดีในมาตรฐาน

person Alok Save    schedule 17.01.2012
comment
โอเค นั่นคือความประทับใจของฉันก็เหมือนกัน รู้สึกโล่งใจที่ได้รับการยืนยัน มีความคิดเกี่ยวกับสิ่งที่คอมไพเลอร์บ่นบ้างไหม? - person Martin; 17.01.2012
comment
@Martin: คุณสามารถสร้างโค้ดแบบสแตนด์อโลนที่เรียบง่ายขนาดเล็กและคอมไพล์บนคอมไพเลอร์ใน Question เพื่อสร้างข้อผิดพลาดได้หรือไม่? - person Alok Save; 17.01.2012
comment
ในที่สุดก็ใช่ ดูการแก้ไขของฉัน หากคุณต้องการลองใช้ ให้ใส่ใจกับพารามิเตอร์ของคอมไพเลอร์ แตกต่างเล็กน้อย (ไม่มี O3) ไม่ส่งผลให้เกิดข้อผิดพลาด - person Martin; 17.01.2012