下面的類旨在監視另一個進程的變化狀態;它的構造函數設置了const引用以方便訪問相關變量。這裏的構造函數代碼:爲什麼C++編譯器在此處生成臨時文件?
template<typename FZYRSRC>
struct MergeableHeight: public FzyQty<FZYRSRC>
{
MergeableHeight(
const DDBuffer& me, const DDBuffer& neighbor, Orientation ori, bool useV =false)
: iP(me[PEAK_V].index()), iNP(neighbor[PEAK_V].index()),
facingNeighbor(iP < iNP ? RIGHT_V : LEFT_V), //vertex pointing to neighbor
facingMe(iP < iNP ? LEFT_V : RIGHT_V), //neighbor's vertex pointing to me
iMyEdge(edgeBar(me,facingNeighbor)), iNeighborEdge(edgeBar(neighbor,facingMe)),
myEdgeVal(me[facingNeighbor].datum()), neighborEdgeVal(neighbor[facingMe].datum()),
myPeakVal(me[PEAK_V].datum()), useVolatility(useV),o(ori)
{}
//member functions etc.
private:
virtual MergeableHeight* clone()const {return new MergeableHeight(*this);}
const int &iP, &iNP;
const PeakVertex facingNeighbor, facingMe; //PeakVertex is Enum {LEFT_V,PEAK_V,RIGHT_V}
const int &iMyEdge, &iNeighborEdge;
const double &myEdgeVal, &neighborEdgeVal, &myPeakVal;
const Orientation o;
bool useVolatility;
};
感興趣的類的數據成員是兩個const int的引用iMyEdge和iNeighborEdge,初始化爲
iMyEdge(edgeBar(me,facingNeighbor)), iNeighborEdge(edgeBar(neighbor,facingMe)),
和3常量浮動引用myEdgeVal,neighborEdgeVal,myPeakVal,初始化as
myEdgeVal(me[facingNeighbor].datum()),
neighborEdgeVal(neighbor[facingMe].datum()),
myPeakVal(me[PEAK_V].datum()),
在前一種情況下(ints),引用按預期工作。在浮動的情況下,編譯器給出了消息
「警告C4413:'MergeableHeight :: myEdgeVal':引用成員被初始化爲一個暫時的,在構造函數退出後不會持久化,」並且類似地爲其他兩個浮動。
用戶定義的DDBuffer類型封裝了一個具有固定數量DataDescriptors的向量 - 另一個用戶定義的類型。 DataDescriptor提供了成員函數數據(),
const float& datum()const {return _datum;}
而DDBuffer提供[]操作,
const DatumDescriptor& operator[](int i)const {return buffer.at(i);}
DatumDescriptor& operator[](int i) {return buffer.at(i);} //const & non-const versions
由於寄託都返回引用,爲什麼地球上是一個在這裏被創建的臨時?特別是,總的來說,狀態變量應該反映傳遞給ctor的引用中的實際值,所以即使它保持在範圍內,我當然也不希望臨時創建它們。
我在想什麼?
易讀的縮進。 –