2015-07-14 14 views
8

Yazılımımızda 1.58 ve VS2013'ü yükseltmek için güncellediğimden beri çökmeler görüyorum. Sadece derleyici optimizasyonu açık olduğunda çökmeleri görürüz. 1.55 desteği ile kaza olmaz. Ben boost::any_range için gördüğüm sorunu ve nasıl kullandığımızı ayırmayı başardım. AşağıdaBu bir Visual Studio 2013 güncelleştirmesi 4 C++ en iyileştirici hatası mı yoksa kodum yanlış mı?

#include <boost/range/any_range.hpp> 
#include <boost/range/adaptor/transformed.hpp> 
#include <vector> 
#include <memory> 
#include <cstdio> 

class DummyElement 
{ 
public: 
    float f_; 
}; 

using ElementRange = boost::any_range < DummyElement*, boost::bidirectional_traversal_tag >; 

using DummyElementUPtr = std::unique_ptr <DummyElement> ; 

class BoostAnyTest 
{ 
public: 
    BoostAnyTest() 
    { 
     for (int i = 0; i < 10; ++i) 
     { 
      auto element = DummyElementUPtr(new DummyElement()); 
      _tprintf(_T("BoostAnyTest::ctor() 0x%p\n"), element.get()); 

      c_.emplace_back(std::tuple<Int, DummyElementUPtr>(i, std::move(element))); 
     } 
    } 

public: 
    ElementRange GetAll(); 

private: 
    using _ContainerType = std::vector < std::tuple<Int, std::unique_ptr<DummyElement>> > ; 
    _ContainerType c_; 
}; 


ElementRange 
BoostAnyTest::GetAll() 
{ 
    auto transform = [ ] (const _ContainerType::value_type& v) -> DummyElement* 
    { 
     return std::get<1>(v).get(); 
    }; 

    return c_ | boost::adaptors::transformed(transform); 
} 


int 
main() 
{ 
    BoostAnyTest any; 

    auto range = any.GetAll(); 

    std::for_each(std::begin(range), std::end(range), [ ] (DummyElement* element) 
    { 
     _tprintf(_T("TestBoostAnyRange() 0x%p\n"), element); 
    }); 
} 

program çıkarılır:

aşağıdaki örnek kod bakın. DEBUG versiyonu çıktı ne beklemek, ancak optimize AÇIKLAMASI versiyonu şu anda bana gizlememiz olduğunu ...
DEBUG version output: 
BoostAnyTest::ctor() 0x007D0FB0 
BoostAnyTest::ctor() 0x007D0E30 
BoostAnyTest::ctor() 0x007D0E60 
BoostAnyTest::ctor() 0x007D1160 
BoostAnyTest::ctor() 0x007D0E90 
BoostAnyTest::ctor() 0x007D10A0 
BoostAnyTest::ctor() 0x007D0F80 
BoostAnyTest::ctor() 0x007D0FE0 
BoostAnyTest::ctor() 0x007D1010 
BoostAnyTest::ctor() 0x007D1040 
TestBoostAnyRange() 0x007D0FB0 
TestBoostAnyRange() 0x007D0E30 
TestBoostAnyRange() 0x007D0E60 
TestBoostAnyRange() 0x007D1160 
TestBoostAnyRange() 0x007D0E90 
TestBoostAnyRange() 0x007D10A0 
TestBoostAnyRange() 0x007D0F80 
TestBoostAnyRange() 0x007D0FE0 
TestBoostAnyRange() 0x007D1010 
TestBoostAnyRange() 0x007D1040 

RELEASE version output: 
BoostAnyTest::ctor() 0x00BFA358 
BoostAnyTest::ctor() 0x00BFA238 
BoostAnyTest::ctor() 0x00BFA3E8 
BoostAnyTest::ctor() 0x00BFA248 
BoostAnyTest::ctor() 0x00BFA258 
BoostAnyTest::ctor() 0x00BFA268 
BoostAnyTest::ctor() 0x00C2ECB8 
BoostAnyTest::ctor() 0x00C2ED98 
BoostAnyTest::ctor() 0x00C2EDA8 
BoostAnyTest::ctor() 0x00C2ED48 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 
TestBoostAnyRange() 0x00A5FCE0 

Belki benim kodu yanlış veya gerçekten optimizer bir hata nedir? Herhangi bir ipucu çok takdir edilecektir!

+2

'_ContainerType' ayrılmış bir addır (çünkü bir alt harfi ve ardından büyük harfle başlar). Yine de senin sorunun ile ilgili değil. – dyp

+2

Bir derleyici hatası gibi görünmüyor: http://coliru.stacked-crooked.com/a/edcdb838034085ca – dyp

+3

Lütfen çok küçük bir test çantası sunun. Bir "ana" işlevi olurdu. Ayrıca ... derleyici uyarılarınızı açın !!!!!!!!!!!!!! –

cevap

11

Bu, Boost bug 10493 (Boost 1.56'da tanıtılmıştır, bu nedenle kodunuz Boost 1.55 ile çalışmaktadır).

geçici çözüm sizin durumunuzda, Reference şablon parametresi olarak T const kullanmaktır:

using ElementRange = boost::any_range < 
    DummyElement*, 
    boost::bidirectional_traversal_tag, 
    DummyElement* const 
>; 

Example.

+0

Bunlara ve cevaplarınıza ve önerilerinize çok teşekkürler! – Jormungand999

İlgili konular