2013-08-18 4 views
9

배열 및 값 초기화에 대한 질문이 두 개 있습니다. herehere입니다. 는하지만이 코드로, 나는 잃었어요 : 그 값이 제로가 초기화되지 않습니다으로왜 std :: array <int, 10> x는 0으로 초기화되지 않지만 std :: array <int, 10> x = std :: array <int, 10>() 인 것 같습니다.

예상대로
#include <iostream> 
#include <iomanip> 
#include <array> 

template <class T, class U = decltype(std::declval<T>().at(0))> 
inline U f1(const unsigned int i) 
{T x; return x.at(i);} 

template <class T, class U = decltype(std::declval<T>().at(0))> 
inline U f2(const unsigned int i) 
{T x = T(); return x.at(i);} 

int main() 
{ 
    static const unsigned int n = 10; 
    static const unsigned int w = 20; 
    for (unsigned int i = 0; i < n; ++i) { 
     std::cout<<std::setw(w)<<i; 
     std::cout<<std::setw(w)<<f1<std::array<int, n>>(i); 
     std::cout<<std::setw(w)<<f2<std::array<int, n>>(i); 
     std::cout<<std::setw(w)<<std::endl; 
    } 
    return 0; 
} 

는, 임의의 값을 반환 f1.

    0     0     0 
        1     61     0 
        2     0     0 
        3     0     0 
        4   297887440     0 
        5    32767     0 
        6    4196848     0 
        7     0     0 
        8   297887664     0 
        9    32767     0 

는 개인적으로 내가 f2이/임의의 값 및 복사와 배열을 생성 x로 이동합니다 생각 : 그러나 f2 독점적으로 0 값을 반환하는 것 같다. 그러나 그럴 것 같지 않습니다.

  • 이유 :

    그래서, 나는이 개 질문이?

  • Do C++ 11 std::array<T, N> 및 C-style T[N]은 이러한 상황에서 동일한 동작을합니까? =없이 우리와 같이 초기화 {} 또는 () 사용
+3

'T()'는 값으로 초기화되는'T'입니다. 그리고'T'가 C 스타일 배열 타입이라면 유효하지 않은 구문입니다. 'T x = {};'또는'T x {};'는보다 일반적으로 적용 가능한 구문입니다. – Casey

+0

@ Casey 값 초기화는 C 스타일 배열에 적용됩니다. 'T'가 단순형 지정자가 아닌 경우, 즉 유형을 명명하는 단일 식별자 또는 키워드가 아닌 경우 'T()'는 구문 오류입니다. C++ 03에서,'= {}'은 배열에만 적용되며 간단한'{}'는 에러입니다. – Potatoswatter

+0

복제본은 값 초기화에 관한 것이지만이 질문은 기본 초기화에 관한 것입니다. 다시 열어 적절한 사본을 찾거나 대답하십시오. – Potatoswatter

답변

9

, 초기화 값을 초래한다. 암시 적으로 선언 된 생성자가있는 유형의 경우 값 초기화는 0 초기화를 구현합니다. 이름에서 알 수 있듯이 각 원시 요소는 0으로 설정됩니다. 이것은 생성자가 실행되기 전에 발생하지만이 경우 생성자는 아무 작업도 수행하지 않습니다.

생성자가 아무것도 수행하지 않으므로 (보통) 초기화되지 않은 데이터를 볼 수 있습니다.

C 스타일 배열의 경우 = T() 대신 = {}을 사용하면 동작이 비슷합니다. 후자가 올바르지 않기 때문입니다. T()은 임시 배열 객체가 명명 된 객체에 할당되도록 요청하지만 배열을 할당 할 수 없습니다. 한편 = {}은 배열에 braced-initializer-list를 할당하고 braced-initializer-list는 표현식이나 객체가 아닌 특별한 구문 구조입니다.

관련 문제