2016-04-11 13 views
8

मैं जीसीसी 4.7.2 का उपयोग कर रहा और SUSE एंटरप्राइज लिनक्स पर 1.58.0 बढ़ावा 11. मैं निम्नलिखित कोड का टुकड़ा जो मूल रूप से बहुभुज की एक सूची के माध्यम से चला जाता है की गणना करने के उनके लंबाई चौड़ाई। मैं std :: minmax फ़ंक्शन के साथ 'ऑटो' कीवर्ड का उपयोग करते समय अजीब आउटपुट देख रहा हूं। तुलना करने के लिए, मैं एक दूसरा चर घोषित करता हूं जहां प्रकार स्पष्ट रूप से घोषित किए जाते हैं (यानी, मंद बनाम dim1)।'ऑटो' और साथ अजीब व्यवहार अवलोकन std :: minmax

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; 
} 

उत्तर

13

यह प्रकार निर्दिष्टकर्ता रूप auto उपयोग करने के लिए नहीं जहां के उन मामलों में से एक है।

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

क्या auto निकालना होगा कि: std::minmaxसंदर्भ की एक जोड़ी देता है। लेकिन 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)}); 

लेकिन मैं बस स्पष्ट रूप से नामकरण का सुझाव देना चाहता हूं। ऐसा लगता है कि मेरे लिए कम त्रुटि-प्रवण है।

संबंधित मुद्दे