为什么C++编译器在这里生成一个临时的?

I G*_*ieb 1 c++

以下类用于监视另一个进程的更改状态; 它的构造函数设置const引用以便于访问相关变量.这是代码:

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;
  };
Run Code Online (Sandbox Code Playgroud)

感兴趣的类数据成员是两个const int引用iMyEdge和iNeighborEdge,初始化为

  iMyEdge(edgeBar(me,facingNeighbor)), iNeighborEdge(edgeBar(neighbor,facingMe)),
Run Code Online (Sandbox Code Playgroud)

并且3 const float引用myEdgeVal,neighborEdgeVal,myPeakVal,初始化为

  myEdgeVal(me[facingNeighbor].datum()), 
  neighborEdgeVal(neighbor[facingMe].datum()),
  myPeakVal(me[PEAK_V].datum()),
Run Code Online (Sandbox Code Playgroud)

在前一种情况(整数)中,引用按预期工作.在浮点数的情况下,编译器给出消息

"警告C4413:'MergeableHeight :: myEdgeVal':引用成员被初始化为一个在构造函数退出后不会持久存在的临时成员,"并且类似于其他两个浮点数.

用户定义的DDBuffer类型封装了具有固定数量的DataDescriptors的向量 - 另一个用户定义的类型.DataDescriptor提供成员函数datum(),

const float& datum()const {return _datum;}
Run Code Online (Sandbox Code Playgroud)

而DDBuffer提供[]运算符,

const DatumDescriptor& operator[](int i)const {return buffer.at(i);}
DatumDescriptor& operator[](int i) {return buffer.at(i);} //const & non-const versions
Run Code Online (Sandbox Code Playgroud)

由于everthing返回引用,为什么在这里创建一个临时的?特别是,重点是状态变量应该反映传递给ctor的引用中的实际值,所以我当然不希望临时创建,即使它仍然在范围内.

我错过了什么?

n. *_* m. 10

datum()返回一个const float&,你的变量是一个const double&.你不能将一个转换为另一个,因此是临时的.