program tip

std :: array에 배열을 채울 값을 취하는 생성자가없는 이유는 무엇입니까?

radiobox 2020. 11. 2. 07:50
반응형

std :: array에 배열을 채울 값을 취하는 생성자가없는 이유는 무엇입니까?


부재입니다

std::array<T,size>::array(const T& value);

감독? 나에게 매우 유용 해 보이며 동적 컨테이너 (예 std::vector:)에는 유사한 생성자가 있습니다.

나는 완전히 알고있다

std::array<T,size>::fill(const T& value);

그러나 그것은 생성자가 아니며 메모리가 먼저 제로화됩니다. 내가 모두를 원하는 경우는 -1'같은이야 이 사람 ?


std::array 의도적으로 집계이므로 사용자가 선언 한 생성자가 없습니다.

말했듯이 fill기본 구성 후에 사용할 수 있습니다 . 집계이기 때문에 기본 생성은 메모리를 0으로 만들지 않지만 초기화되지 않은 상태로 둡니다 (포함 된 유형이 사소하게 초기화 가능한 경우).


배열이 0으로 초기화되지 않고 복사 생성자가 있고 수행한다는 사실을 활용하여 이러한 유형의 생성자를 효율적으로 시뮬레이션 할 수 있습니다.

template <size_t N, class T>
array<T,N> make_array(const T &v) {
    array<T,N> ret;
    ret.fill(v);
    return ret;
}

auto a = make_array<20>('z');

우선, 그것은 아니고 std::array<T>, 컴파일 시간 상수 적분 표현식 std::array<T,N>있는 곳 N입니다.

둘째, std::array의도적으로 집계됩니다. 따라서 집계되지 않는 것이 없으므로 생성자와 소멸자, 가상 함수 등이 없습니다.


다음을 사용할 수 있습니다 std::index sequence.

namespace detail
{

    template <typename T, std::size_t...Is>
    constexpr std::array<T, sizeof...(Is)>
    make_array(const T& value, std::index_sequence<Is...>)
    {
        return {{(static_cast<void>(Is), value)...}};
    }
}

template <std::size_t N, typename T>
constexpr std::array<T, N> make_array(const T& value)
{
    return detail::make_array(value, std::make_index_sequence<N>());
}

데모

std::make_index_sequence C ++ 14이지만 C ++ 11로 구현할 수 있습니다.

static_cast<void>(Is)제공 operator,T수있는 악을 처리 하는 것입니다.

참고 URL : https://stackoverflow.com/questions/17923683/why-does-stdarray-not-have-an-constructor-that-takes-a-value-for-the-array-to

반응형