Sayı

2012-08-27 10 views
8

Aşağıdaki koduSayı

#include <iostream> 
#include <array> 

class testClass 
{ 
    std::array<int, 2> testArray; 

    public: 
     testClass(); 
     void func() const; 

}; 

testClass::testClass() : testArray({{1, 2}}) 
{ 
} 

void testClass::func() const 
{ 
    for (int i = 0; i < 2; ++i) 
     std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';  
} 


int main() 
{ 
    testClass test; 
    test.func(); 
} 

ile üye std kontrol :: MinGW (gcc 4.7.0) ile dizi garip davranış sınırlarını alıyorum sadece -O ile derlenmiş, ben -O olarak etkin bireysel bayraklarını çalıştı ama başka daraltmak olamazdı ekinler olarak Çıktı,

0 
1 
0 
2 

hata optimizasyonu ile ilişkili olduğu görünmektedir olduğunu. Const olmayan işlevi yapmak da sorunu giderir. Bu bir hata olabilir mi yoksa bir şey mi özlüyorum? -std=c++11 -O Windows XP SP3 ve Windows 7 üzerinde mingw 4.7.0 kullanılarak derlenmiş yukarıdaki gibi düzenlemek

aşağı Daralmış *

, .at()

#include <iostream> 
#include <array> 

int main() 
{ 
    std::array<int, 2> const testArray = {1, 2}; 

    for (int i = 0; i < 2; ++i) 
     std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';  
} 

aynı çıktı const sürümünde bir hata gibi görünen sp1.

* edit 2

aynı çıktı yine

#include <iostream> 
#include <array> 

int main() 
{ 
    typedef std::array<int, 2> Tarray; 
    Tarray test = {1, 2}; 

    for (int i = 0; i < 2; ++i) 
     std::cout << const_cast<Tarray const*>(&test)->at(i) << '\n' << test.at(i) << '\n';  
} 
+0

http://liveworkspace.org/code/b0d5b3c7398f7e1a2e36838f23fc943c iyi çalışıyor düzgün çalıştığını

#ifdef __EXCEPTIONS constexpr const_reference at(size_type __n) const { return __n < _Nm ? _M_instance[__n] : (throw out_of_range(__N("array::at"))), _M_instance[__n]; /*return __n < _Nm ? _M_instance[__n] : throw out_of_range(__N("array::at"));*/ } #else const_reference at(size_type __n) const { if (__n >= _Nm) std::__throw_out_of_range(__N("array::at")); return _M_instance[__n]; } #endif 

benim dizinin başlığındaki kodunu değiştirmek. – ForEveR

+4

Kesinlikle bana bir böcek gibi görünüyor. –

+0

Bu benim için [farklı bir çıkış] (http://ideone.com/ZhIsS) üretir ... – dasblinkenlight

cevap

5

Bu dizi başlığında ana dosyadaki

#ifdef __EXCEPTIONS 
    constexpr const_reference 
    at(size_type __n) const 
    { 
return __n < _Nm ? 
     _M_instance[__n] : throw out_of_range(__N("array::at")); 
    } 
#else 
    const_reference 
    at(size_type __n) const 
    { 
if (__n >= _Nm) 
    std::__throw_out_of_range(__N("array::at")); 
return _M_instance[__n]; 
    } 
#endif 

undef __EXCEPTIONS parçasıdır (veya dizideki #ifndef için #ifdef değiştirmek) yol açar Doğru çıkış Bilmiyorum, bu doğru bir çözüm ya da değil, ama işe yarıyor.

UPD: Ben Şimdi her şey

+8

Eşlenmemiş üstbilgideki hata, '__n <_Nm? _M_instance [__ n]: throw out_of_range (__ N ("array :: at")) 'bir geçici değeri değerlendirir (koşullu bir işleç, işlenenlerden biri bir" throw "ifadesi ise, bir prvalue değerini değerlendirmek zorundadır - C++ 11 5.16/2). Bu geçici ömür, yalnızca 'dönüş' ifadesinin tam ifadesinin sonuna kadardır (C++ 11 12.2/5). Yani, 'at() işlevi artık geçerli olmayan bir öğeye bir const başvuru döndürür - sonuç tanımsız bir davranıştır. –

+0

korkunç bir hata ('a dönüşü: b: throw c;') --- bu yeni başlayanlar hatalarının herhangi bir sevk edilen C++ konteynır ile geldiğini düşünmezdim. – Walter

+3

@MichaelBurr: Bence kendi başına bir cevap olabilir! –