使用'auto'和std :: minmax观察奇怪的行为

用户4979733

我在SUSE Enterprise Linux 11上使用GCC 4.7.2和Boost 1.58.0。我有以下代码片段,该代码片段基本上通过多边形列表来计算其长度/宽度。在std :: minmax函数中使用'auto'关键字时,我看到奇怪的输出。为了进行比较,我还声明了第二个变量,在其中明确声明了类型(即dim vs dim1)。

namespace gtl = boost::polygon;
typedef gtl::polygon_90_data<int> LayoutPolygon;
typedef gtl::rectangle_data<int> LayoutRectangle;
static LayoutFeatureVec
calc_stats(LayoutPolygonSet const& lp)
{
   LayoutFeatureVec v;
   LayoutFeature f;
   LayoutRectangle y;
   for (LayoutPolygon const& p : lp) {
      // Compute bounds.
      gtl::extents(y, p);

      // Get width/length (shorter/longer).
      // FIXME: Why does this not work with auto??
      cout << gtl::delta(y, gtl::HORIZONTAL) << " " << gtl::delta(y, gtl::VERTICAL) << endl;

      auto dim = std::minmax(gtl::delta(y, gtl::HORIZONTAL),
                             gtl::delta(y, gtl::VERTICAL));

      std::pair<int, int> dim1 = std::minmax(gtl::delta(y, gtl::HORIZONTAL),
                                             gtl::delta(y, gtl::VERTICAL));

      cout << dim.first << " " << dim.second << endl;
      cout << dim1.first << " " << dim1.second << endl;

      <snip>
      v.push_back(f);
   }

   return v;
}

对于此循环的第一次迭代,预期输出是正确的。

380 420
380 420
380 420

但是,如果我注释掉'dim1'并重新运行相同的代码(即,只有自动变暗),则使用std :: minmax会得到怪异的结果。

380 420
140737295994126 140737295994126

我在这里做错了什么?

这是最小的示例(根据下面的答案进行编辑)。

#include <iostream>
#include <algorithm>
#include <boost/polygon/polygon.hpp>

using namespace std;

namespace gtl = boost::polygon;
using namespace gtl::operators;

int main(int argc, char** argv)
{
    gtl::rectangle_data<int> x(0,0,5,5);

    auto dim = std::minmax(gtl::delta(x, gtl::HORIZONTAL), gtl::delta(x, gtl::VERTICAL));
    cout << dim.first << " " << dim.second << endl;

    return 0;
}
巴里

这是在哪里的情况下,一个不能使用auto的类型说明符。std::minmax返回一对引用

template< class T > 
std::pair<const T&,const T&> minmax( const T& a, const T& b );

auto将是推断。但是delta()返回一个临时的。所以当你写:

auto dim = std::minmax(gtl::delta(y, gtl::HORIZONTAL),
                       gtl::delta(y, gtl::VERTICAL));

dim持有两个悬挂的参考。但是当你写:

std::pair<int, int> dim1 = std::minmax(...);

您只是直接保留值。这就是为什么这种方法行得通,但auto不行的原因您正在执行的额外转换会阻止您保持悬空的引用。


另外,为了完整性,您可以使用minmax不返回引用的其他重载

template< class T >
std::pair<T,T> minmax( std::initializer_list<T> ilist);

这只是涉及一些额外的括号:

auto dim2 = std::minmax({gtl::delta(y, gtl::HORIZONTAL),
                         gtl::delta(y, gtl::VERTICAL)});

但是我建议只明确命名类型。对我来说,这似乎不太容易出错。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: minmax()和std :: tie的重载

来自分类Dev

std :: function的奇怪行为

来自分类Dev

MySQL:使用UNION,MAX和GROUP BY的奇怪行为

来自分类Dev

使用scrollTop的奇怪行为

来自分类Dev

std :: map的奇怪行为

来自分类Dev

结合使用Data :: Dump和JSON :: XS的奇怪行为

来自分类Dev

使用nltk句子标记器和特殊字符的奇怪行为

来自分类Dev

使用std map和shared_ptr的奇怪内存行为

来自分类Dev

auto &&和auto之间的区别

来自分类Dev

std :: vector的奇怪行为

来自分类Dev

使用OpenGL和GLSL的SSAO算法的奇怪性能行为

来自分类Dev

“ int &&”和“ auto &&”之间的行为不同

来自分类Dev

朱莉娅使用fill()和。+ =的“奇怪”行为

来自分类Dev

在std :: map中使用'auto'

来自分类Dev

||奇怪的Ruby行为 和 &&

来自分类Dev

使用函数和参数作为函数的参数-奇怪的行为?

来自分类Dev

std :: async的奇怪行为

来自分类Dev

std :: map的奇怪行为

来自分类Dev

使用getline和awk的奇怪行为

来自分类Dev

加入和的奇怪行为

来自分类Dev

std :: unique_ptr和std :: ostringstream(SIGSEGV)的奇怪行为

来自分类Dev

结合使用Data :: Dump和JSON :: XS的奇怪行为

来自分类Dev

使用NSTimer和动画的UIImageView和UILabel的奇怪行为

来自分类Dev

使用std map和shared_ptr的奇怪内存行为

来自分类Dev

auto &&和auto之间的区别

来自分类Dev

在Mac终端中同时使用lsof和awk的奇怪行为?

来自分类Dev

在Mac终端中同时使用lsof和awk的奇怪行为?

来自分类Dev

std::cout 的奇怪行为

来自分类Dev

OpenXml 和奇怪的行为