C++ 检查增压点_xy是否已初始化?

C++ 检查增压点_xy是否已初始化?,c++,boost,boost-geometry,C++,Boost,Boost Geometry,我定义了一个typedef,并且: typedef boost::geometry::model::d2::point_xy<double> boost2dPoint; boost2dPoint min_p; //. //.(under a condition: min_p will be initialized) //. for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv ) { Region::P

我定义了一个typedef,并且:

typedef boost::geometry::model::d2::point_xy<double> boost2dPoint;
boost2dPoint min_p;
//.
//.(under a condition: min_p will be initialized)
//.
for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv )
{
  Region::Point v_point = (*itv).pnt();
  if( (v_point(0) == min_p.x()) && (v_point(1) == min_p.y()) )
  {
     return *itv;
  }
}

如何检查min_p是否已初始化???

如果您试图使用可能未初始化的变量,则会收到此警告。您需要为每个路径提供初始化。声明变量时提供默认初始化,或者在条件的
else
中提供值。

这不是运行时条件

我是静态分析(编译时间)的daignostic

只需初始化数据

boost2dPoint min_p {};


你不能,至少不能单独使用这个对象。未初始化的数据没有特别标记,只是没有指定的值。您可以有一个
bool
标志,该标志最初设置为
false
,并在
min\u p
初始化时将其设置为
true
,但如果您要这样做,我建议使用
boost::optional

// this is default-initialized to know that its
// data part (a boost2dpoint) is uninitialized
boost::optional<boost2dpoint> min_p; 

// initialize later
if(some_condition()) {
  min_p = boost2dpoint(foo, bar);
}

// use still later:

// Check if min_p has associated data. 
if(min_p) {
  for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv )
  {
    Region::Point v_point = (*itv).pnt();

                          // +-- note: -> instead of . here. boost::optional is
                          // v                  designed to look like a pointer.        
    if( (v_point(0) == min_p->x()) && (v_point(1) == min_p->y()) )
    {
      return *itv;
    }
  }
}
//这是默认初始化,以知道其
//数据部分(boost2dpoint)未初始化
boost::可选最小值;
//稍后初始化
if(某些条件()){
min_p=boost2dpoint(foo,bar);
}
//请稍后使用:
//检查min_p是否有相关数据。
如果(最小值){
对于(Region::Iterator itv=s.beginVer();itv!=s.endVer();++itv)
{
区域::点v_点=(*itv).pnt();
//+--注意:->而不是.here.boost::可选
//v设计成一个指针。
如果((v_点(0)=min_p->x())&&(v_点(1)=min_p->y())
{
返回*独立电视台;
}
}
}

我会留下一个到的链接,它不是很长。

谢谢你的回答,但是第二个建议是:有一个v_点(0,0);然后,它将返回错误的结果,而不是nullentity;否则:错误:在C++98中,“min_p”必须由构造函数初始化,而不是由“{…}”初始化。这是什么nullentity,您似乎在谈论什么?请注意,
minu p={}
将在c++98(聚合初始化)中工作。我强烈地假设默认的point_xy实现在很大程度上是一个POD。没有“nullentity”。谢谢你的回答,但我想知道boost中是否有任何针对null对象的嵌入函数。谢谢,尽管我使用if(min_p.is_initialized()){…};我仍然收到此函数中可能未初始化使用的“((void)&min_p+8)”[-Wmaybe uninitialized]警告是虚假的。但奇怪的是,你得到了它;此警告已在多年前修复。您使用的是非常旧版本的gcc还是boost?boost 1.56、gcc 4.7.2Strange。我只是用GCC4.7.4和Boost1.55(使用-Wall-Wextra-pedantic,显式使用-Wmaybe uninitialized)进行了尝试,没有收到任何警告。您确定没有在选中块之外的某个位置使用
*min\u p
boost2dPoint min_p (0,0);
// this is default-initialized to know that its
// data part (a boost2dpoint) is uninitialized
boost::optional<boost2dpoint> min_p; 

// initialize later
if(some_condition()) {
  min_p = boost2dpoint(foo, bar);
}

// use still later:

// Check if min_p has associated data. 
if(min_p) {
  for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv )
  {
    Region::Point v_point = (*itv).pnt();

                          // +-- note: -> instead of . here. boost::optional is
                          // v                  designed to look like a pointer.        
    if( (v_point(0) == min_p->x()) && (v_point(1) == min_p->y()) )
    {
      return *itv;
    }
  }
}