2012-01-17 4 views
4

У меня есть следующий конструктор объектаЗаконно ли использовать функции, возвращающие временный в списках Инициализатора

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

mOrigin имеет тип Vector3df и функции toVector3df(QPointF const&) возвращает временный Vector3df. Все идет нормально. Код компилируется отлично и работает как charm под linux, gcc 4.4.3. активировано большинство предупреждений.

Теперь я хотел кросс-компиляции тот же код для Nokia Smartphone (Meamo Фримантл) и вдруг я получаю очень странные предупреждения компилятора:

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) более серьезным или ошибочным?

Спасибо заранее, Мартин

Edit: Вот минимальный пример, извините за длину :-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 не наследует, все работает нормально.

+0

Является ли 'toVector3df' членом функции? –

+0

Нет шаблона без члена – Martin

+0

Можете ли вы воспроизвести это в небольшом примере, который вы можете вставить в вопрос? –

ответ

3

Нет ничего плохого в использовании функций, возвращающих временные списки инициализаторов членов.
Даже порядок, в котором члены будут инициализированы, четко определен в стандарте.

+0

Хорошо, это тоже было мое впечатление, с облегчением, чтобы убедиться, что это подтверждено. Любая идея о том, что компилятор жалуется? – Martin

+0

@Martin: Можете ли вы создать небольшой минималистический автономный код и скомпилировать его в компиляторе в вопросе о воспроизведении ошибки? –

+0

Наконец, да, см. Мое редактирование. Если вы хотите попробовать, обратите внимание на параметры компилятора. Немного отличающийся (без O3) не привел к ошибке – Martin