2009-08-02 5 views
3

안녕하세요. C++ 프로그래머. 가 내가 될 수 있도록 노력하겠습니다 무엇을 가지고, STL 컨테이너에 대한 빠른 질문 : (적절한 포함하여) 어떤 C++ SourceFile을 사용할 때STL 컨테이너의 const 포인터

std::list<std::string> l; 

이 문장은 잘 컴파일합니다. 그러나

std::list<const std::string> m; 

또는

std::list<std::string * const> n; 

는 GCC (GCC 버전 4.0.1 (애플사가 5484을 구축))를 사용할 때 컴파일에 실패. 그러나 Visual Studio 2008 C++ 컴파일러를 사용하면 불만이 제기되지 않습니다.

약간의 연구 결과에 따르면 STL 컨테이너의 요소는 Assignable이어야합니다. VC 구현에 STL 버그가 있습니까? (예 : '있을 법하지 않음') 또는 Assignable의 다른 개념을 사용합니까?

답변

4

기술적으로 컨테이너 요소는 할당 가능해야하지만 std::list에서는 목록 노드가 거의 이동하지 않으므로 일단 생성 된 후에는 복사하거나 (확인하거나) 할당 할 필요가 없습니다 (오류가 발생할 수 있음).

컴파일러가 할당 가능성을 테스트하는 방법을 벗어나지 않으면 기술적으로 적합하지 않더라도 많은 목록 연산을 인스턴스화해도 컴파일 오류가 실제로 발생하지는 않습니다.

+0

커브 와이즈를 배우고 여러 컴파일러를 사용하는 것이 좋습니다. 그러나, 나는 그러한 미끄러운 과제를 가리키는 정적 분석 도구를 갖고 싶어합니다. – msi

+0

[STLport] [http://www.stlport.org/]를 확인해보십시오. 나는 그것을 다시 설치해야하고 이것이 이것을 잡는 지 알아봐야 할 것이다. –

4

컨테이너의 내용은 할당 가능해야하며 (const가 아님) 컴파일러는 실제로 사용되지 않는 한 모든 템플릿 메소드를 인스턴스화 할 필요가 없습니다.이 때 컴파일러는 const 문제를 발견 할 수 있습니다. 일부 컴파일러는 다른 것보다이 작업을하는 것이 좋습니다.

+1

+1, 요점은 "템플릿 매개 변수를 할당 할 수 있어야합니다"라는 제약 조건입니다. 컴파일러가 그렇지 않은 경우 컴파일러에서 알려주는 것은 아닙니다. –

2

STL은 값 유형 의미 (copy c-tor 및 operator =)를 지원하는 데이터 형식을 처리합니다. 문제는 const이며, 포함 된 값이 값 유형 의미를 지원하지 않습니다. 예를 들어

: 당신이 목록의 요소에 값을 할당 할 수 없기 때문에

std::list<const std::string> m; 

이 실패합니다.

+0

저는 const/Assignable 문제를 이해합니다. 그러나 VS가 내 질문에 일치 코드를 사용할 때 오류 메시지를 표시하지 않는 이유는 무엇입니까? – msi

관련 문제