programing

C ++ 11은 벡터를 허용합니까

nasanasas 2020. 11. 25. 08:01
반응형

C ++ 11은 벡터를 허용합니까?


컨테이너 요구 사항이 C ++ 03에서 C ++ 11로 변경되었습니다. C ++ 03에는 포괄적 인 요구 사항 (예 : 벡터에 대한 복사 구성 및 할당 가능성)이 있었지만 C ++ 11은 각 컨테이너 작업에 대한 세부적인 요구 사항을 정의합니다 (섹션 23.2).

따라서 할당이 필요하지 않은 특정 작업 만 수행하는 한 (construction이며 push_back이러한 작업 인 경우) 벡터에 복사 생성 가능하지만 할당 할 수없는 유형 (예 : const 멤버가있는 구조)을 저장할 수 있습니다. ; insert아닙니다).

내가 궁금한 것은 이것이 표준이 이제 허용한다는 의미 vector<const T>입니까? 나는 그것이 안되는 이유를 보지 못했다- const T, const 멤버가있는 구조처럼, 복사는 구성 할 수 있지만 할당 할 수없는 유형이다-그러나 나는 무언가를 놓쳤을 수있다.

(내가 뭔가를 놓쳤다 고 생각하게 만드는 부분 중 하나는 인스턴스화하려고하면 gcc 트렁크가 충돌하고 화상을 입지 vector<const T>vector<T>T에 const 멤버가있는 곳에서는 괜찮습니다 ).


아니요, 할당 자 요구 사항에 따르면 T는 "비상 수, 비 참조 객체 유형"이 될 수 있습니다.

상수 객체로 구성된 벡터로는 많은 일을 할 수 없습니다. 그리고 a const vector<T>는 어쨌든 거의 동일합니다.


몇 년이 지난 후에도이 빠르고 더러운 대답은 여전히 ​​댓글과 투표를 끌어들이는 것 같습니다. 항상 위로는 아닙니다. :-)

따라서 적절한 참조를 추가하려면 :

내가 종이에 가지고있는 C ++ 03 표준의 경우 [lib.allocator.requirements] 섹션의 표 31에 다음과 같이 나와 있습니다.

T, U any type

어떤 유형도 실제로 작동 하지 않았습니다 .

따라서 다음 표준 인 C ++ 11 은 [allocator.requirements]와 현재 표 27의 초안 에서 다음과 같이 말합니다 .

T, U, C any non-const, non-reference object type

이것은 내가 위에서 처음 기억에서 쓴 것과 매우 유사합니다. 이것은 또한 질문에 관한 것입니다.

그러나 C ++ 14 ( draft N4296 )에서는 이제 표 27에 다음과 같이 표시됩니다.

T, U, C any non-const object type

아마도 참조가 결국 객체 유형이 아니기 때문일까요?

이제 C ++ 17 ( 초안 N4659 )에서는 다음과 같은 표 30이 있습니다.

T, U, C any cv-unqualified object type (6.9)

따라서 const배제 될뿐만 아니라 volatile. 어쨌든 오래된 뉴스 일 것입니다.


현재 바로 아래에있는 Howard Hinnant의 직접 정보를 참조하십시오 .


최신 정보

받아 들여진 (그리고 정확한) 대답 아래에서 나는 2011 년에 다음과 같이 언급했습니다.

결론 : 우리는 const T. 나는 그것에 대해 약간의 생각을했지만. 그리고 우연히 그렇게하는 것에 정말 가까워졌습니다. 내가 아는 한, 현재의 부착 점은 오버로드의 쌍의 address경우 : 기본 할당에서 멤버 함수 T이며 const,이 두 오버로드가 같은 서명을해야합니다. 이를 수정하는 쉬운 방법 std::allocator<const T>은 오버로드 중 하나 를 전문화 하고 제거하는 것입니다.

다가오는 C ++ 17 초안에서 우리는 이제 합법화 한 것처럼 보이며 실수로vector<const T> 그렇게했다고 믿습니다 . :-)

P0174R0 은에서 address과부하를 제거합니다 std::allocator<T>. P0174R0std::allocator<const T>근거의 일부로 지원에 대해 언급하지 않습니다 .

보정

아래의 주석에서 TC는 address오버로드가 제거 되지 않고 더 이상 사용되지 않는다는 것을 올바르게 지적합니다 . 내 잘못이야. 더 이상 사용되지 않는 멤버는 std::allocator이 정의 된 20.10.9에 표시되지 않지만 대신 섹션 D.9로 강등됩니다. 나는 이것을 게시 할 때 이러한 가능성에 대해 D 장을 스캔하는 것을 무시했습니다.

수정 해주신 TC에게 감사드립니다. 나는이 오해의 소지가있는 답변을 삭제하는 것을 고려했지만, 아마도 내가했던 것과 같은 방식으로 다른 사람이 사양을 잘못 읽지 않도록이 수정 사항을 남겨 두는 것이 가장 좋습니다.


우리는 이미 이것에 대해 아주 좋은 답변을 가지고 있지만 할 수있는 것과 할 수없는 것을 보여주기 위해 좀 더 실용적인 답변으로 기여하기로 결정했습니다.

그래서 이것은 작동하지 않습니다.

vector<const T> vec; 

이유를 이해하려면 다른 답변을 읽으십시오. 그리고 짐작 하셨겠지만이 방법도 작동하지 않습니다.

vector<const shared_ptr<T>> vec;

T더 이상 없습니다 constvector들고 shared_ptr들,하지 T이야.

반면에 이것은 작동 합니다.

vector<const T *> vec;
vector<T const *> vec;  // the same as above

그러나이 경우 const는 포인터 자체 (벡터가 저장하는 것)가 아니라 가리키는 객체입니다. 이것은 다음과 같습니다.

vector<shared_ptr<const T>> vec;

괜찮습니다.

그러나 const표현식의 끝에 넣으면 이제 포인터가로 바뀌 const므로 다음은 컴파일되지 않습니다.

vector<T * const> vec;

약간 혼란 스럽지만 동의하지만 익숙해집니다.


다른 답변을 보완하는 또 다른 방법은 다음을 사용하는 것입니다.

vector<unique_ptr<const T>> vec;

vec항목에 대한 소유권 만있는 경우를 시행하려는 경우 . 또는 vec어떤 시점에서 항목을 이동하는 동적 기능을 원한다면 항목을 밖으로 이동하십시오.

As pointed out, pointer const semantics may be confusing, but shared_ptr and unique_ptr aren't. const unique_ptr<T> is a const pointer and unique_ptr<const T> is a const pointee as you would expect.

참고URL : https://stackoverflow.com/questions/6954906/does-c11-allow-vectorconst-t

반응형