cplusplus.com의 문제점은 무엇입니까?


200

이것은 아마도이 질문에 완벽하게 적합한 포럼은 아니지만 멀리 갈 위험에 처하게하겠습니다.

귀중한 ISO 표준, MSDN , IBM , cppreferencecplusplus를 포함하여 C ++ 표준 라이브러리에 대한 몇 가지 참조가 있습니다 . 개인적으로 C ++을 작성할 때 빠른 임의 액세스, 짧은로드 시간 및 사용 예제가있는 참조가 필요하며 cplusplus.com이 매우 유용하다는 것을 알았습니다. 그러나 나는 SO에 대한 웹 사이트에 대한 부정적인 의견을 자주 듣고 있으므로 구체적으로 설명하고 싶습니다.

cplusplus.com이 제공 한 오류, 오해 또는 잘못된 조언은 무엇입니까? 코딩 결정을 위해 사용하는 위험은 무엇입니까?

이 요점을 추가하겠습니다. 표준에 대한 정확한 인용문으로 여기에 대한 질문에 답변하고 싶습니다. 따라서 즉시 사용 가능한 링크를 게시하고 싶습니다. cplusplus.com은 내가 선택하지 않은 사이트였습니다. 이 문제.


62
왜 다운 보트인가? 이것은 완전히 유효한 질문입니다. 참조가 필요한 경우 신뢰할 수있는 출처를 원합니다. 또한 표준 라이브러리에 대한 빠른 참조를 얻을 수있는 cplusplus.com에 대한 불만도 들었습니다.
Xeo

48
@Olafur : 나는 의견을 원하지 않습니다. 그 사이트에서 실수의 구체적인 목록을 원합니다. 없는 경우이 질문을 사용하여 향후 비판을 철회 할 수 있기를 원합니다.
Kerrek SB 2016

4
@ Ófura Waage : 아마도. 그러나 해당 웹 사이트 컨텐츠의 정확성 / 진실성에 대해 객관적인 요점을 만들 수 있습니다.
Daniel Sloof 2016 년

14
이미 Google의 "cplusplus.com"에 대한 1 페이지에 있습니다. SO 질문이 검색 순위를 얼마나 빨리 올리는지 인상적입니다.
궤도에서 가벼움 레이스

5
이 질문이 "cplusplus"에 대한 검색에서 얼마나 높은 순위를 차지하는 지에 따라 공정하다고 생각합니다.이 질문이 제기 된 이후 cplusplus.com에 대해 많은 수정이 이루어졌습니다. 실제로 실수를 지적하는 상위 3 가지 답변은 더 이상 사실이 아닙니다.
Mark H

답변:


72

편집 :std::remove 이 답변이 작성된 이후 설명서 가 수정되었습니다. 에도 같은 내용이 적용됩니다 list::remove.

cpluscplus.com이 어떻게 잘못 될 수 있는지 보여주는 예를 들어 보겠습니다.

std::remove함수를 고려하십시오 <algorithm>.

사실은 std::remove컨테이너에서 항목을 제거하지 않습니다. 그 이유 std::remove는 한 쌍의 반복자와 만 작동하며 실제로 항목을 포함하는 컨테이너에 대해서는 아무것도 모르기 때문입니다. 사실, std::remove기본 컨테이너를 알 수는 없습니다. 반복자가 속한 컨테이너에 대해 한 쌍의 반복자에서 벗어날 수있는 방법이 없기 때문입니다. 따라서 std::remove실제로는 항목을 제거 할 수 없기 때문에 항목을 제거 하지 않습니다 . 컨테이너에서 항목 을 실제로 제거하는 유일한 방법 은 해당 컨테이너에서 멤버 함수를 호출하는 것입니다.

따라서 항목을 제거하려면 Erase-Remove Idiom 을 사용 하십시오 .

 v.erase(std::remove(v.begin(), v.end(), 10), v.end()); 

그러나에 cplusplus.com대한 잘못된 정보를 제공합니다 std::remove. 그것은 말한다

공지 사항이 기능은 변경하지 않는 새로운 끝에 과거의 요소, 자신의 이전 값을 유지 하고있다 여전히 접근을 .

맞지 않습니다. 범위의 반복자 [new_end, old_end)는 여전히 역 참조 가능하지만 이전 값유지하고 여전히 액세스 가능 하다는 의미는 아닙니다 . 그들은 지정되지 않았습니다.


마찬가지로, 잘못된 정보도 cplusplus.com제공 합니다. 라고 말합니다 .list::remove

글로벌 알고리즘 함수 인 remove 는 유사한 동작으로 존재 하지만 두 반복자 사이에서 작동합니다.

완전히 잘못되었습니다. 글로벌 제거, 즉 std::remove유사하지 않다 list::remove우리는 전자는 것을 본대로, 정말 제거하지 않는 컨테이너에서 항목을 있기 때문에 할 수 없습니다 후자 (멤버 함수)이있는 반면, 정말 제거하지 항목을 이 할 수 있기 때문에 .

이 답변은 다음 주제의 다른 답변에서 수정되었지만 거의 수정되지 않았습니다.

참고 : 위의 주제에서 답장을 할 때 최근에 이것을 보았으므로 기억합니다. 지난 2 년 동안 내가 겪었던 많은 오류가 있는데, 기억 나지 않습니다. 다시 건너면 나중에 몇 개 더 추가 할 수 있습니다.


1
+1 :이 사이트에 잘못된 내용이 더 많이 있습니까?
클라 임

4
@Alexander : list::remove컨테이너에서 요소를 제거합니다. 그러나 std::remove컨테이너에서 요소를 제거하지 마십시오. 나는 그들의 행동이 "유사하다"고 말할 수 없습니다 .
Nawaz

3
좋은 캐치! 그것은 내가 찾고있는 것들의 아주 좋은 예입니다.
Kerrek SB 2016

3
"유사한"은 논쟁의 여지가 있습니다. 왜냐하면 두 개의 다른 작업이 비슷한 지 아닌지에 대한 의견이 있기 때문입니다. cplusplus.com이 문서로 위장한 의견을 제공해야하는지 여부도 논쟁의 여지가 있습니다. 그러나 어쨌든 "이전 값 유지"는 용서할 수없는 오류입니다. 이는 cplusplus 설명이 표준을 기반으로하지 않았 음을 나타냅니다.
Steve Jessop 2016 년

5
@Steve : 당신은 말했다 "Similar" is debateable. 단어가있는 경우 similar논란의 여지가, 그것은 매우이 단어가 올바른 단어하지 않고의 행동을 설명 할 때 피해야한다는 것을 알 수 std::removelist::remove때문에, 설명은 가능한 한 많이, 또 다른 설명이 필요가 없습니다으로 명확해야한다.
Nawaz

38

반대로 약간 의견을 제시 할 것입니다. cplusplus.com에 대한 좋은 정보가 많이 있습니다. 그것을 죽일 때 선택하십시오. 물론 문제가 있지만 어떤 사이트가 그렇지 않습니까? 확실히이 사이트는 아닙니다 . 유리 집에 사는 사람들은 돌을 던져서는 안됩니다. 여기에도 잘못된 정보가 많이 있습니다. 정확하고 잘못된 답이 있고 다운 봇 된 답이 있습니다 (일부 부정적입니다).

cplusplus.com의 한 가지 문제는 폐쇄 된 사이트라는 것입니다. 언급 된 대부분의 다른 참조 사이트에서도 마찬가지입니다. 이는 스택 오버플로와 같은 커뮤니티 개발 사이트의 결정에 위배됩니다. 신뢰할 수있는 편집 기능을 얻는 데 시간이 오래 걸리지 않으며 최신 초보자도 쉽게 개선 제안을 할 수 있습니다. cplusplus.com과 비교해보십시오. 당신이 그들의 직원이 아닌 경우 당신은 영원한 초보자입니다. WG21의 주요 구성원 인 경우에도 해당 사이트 어딘가에 버그가 있으면 이메일 보고서 메커니즘을 거쳐야합니다. 저주!

이 사이트에서 우리 자신의 C ++ 참조를 개발하는 것이 해결책이 될 것입니다. 이것은 약간의 작업이 필요합니다. 우리는 너무 비관적이고 너무 기술적이지 않도록 조심해야합니다. cplusplus.com은 최소한의 기술 편집자들을 고용하고 있으며,이를 바탕으로 pedants를 억제합니다. 정보를 체계적으로 유지해야합니다. 여기 FAQ는 잘 정리되어 있지 않습니다. 우리는 또한 표준에서 너무 많이 추출하지 않도록 매우 조심해야합니다. 그건 불법입니다.


7
예전의 cppreference.com을 자주 사용했지만 이제는 위키 용으로 다시 작성했습니다 (모든 사람이 편집 할 수 있습니까?) ... 더 이상 마음에 들지 않습니다. 중요한 정보를보기가 어렵습니다. cplusplus.com에서 얻는 즉각적인 만족감이 부족합니다. 내 생각에
Kerrek SB 2016

14
우와! 나는 정반대의 것을 본다. 나는 통과하기가 어렵고 글을 잘못 작성했기 때문에 이전 cppreference.com을 자주 사용하지 않았습니다. 새로운 cppreference.com은 마지막 단락에서 제안한 것과 정확히 일치하는 광고가없는 커뮤니티 기반 사이트 인 것 같습니다.
David Hammen

1
어쩌면 그것은 단지 나였을 것입니다. 나는 그것을 다시 시도 할 것입니다. 나는 일부 <thread>또는 <atomic>물건 을 찾고 싶었고 방금 "이 페이지를 작성하십시오"라는 메시지를 받았습니다. 다시 확인하겠습니다! 물론 C ++ 0x 지원은 큰 보너스가 될 것입니다!
Kerrek SB 2016

10
"유리 집에 사는 사람들은 돌을 던져서는 안됩니다." 따라서 cplusplus.com/reference마찬가지로 C ++에 대한 라이브러리 참조라고 주장 하지 않습니다. 사람들이 여기에서 주장을 할 때, 그들은 표준을 인용하여 백업하거나, 그렇지 않으면 다른 누군가가 와서 채워집니다. 그들이 틀렸다면, 당신은 그들의 일을 볼 수 있습니다. cplusplus.com이 잘못된 경우, 저자가 "요소에 대한 자세한 설명"을 생성하는 데 사용한 것 이외의 일부 C ++ 구현에서는 실패 할 코드를 작성했습니다. 문제는 cplusplus.com이 비공식적이지만 공식적으로 보이도록 작성되었다는 것입니다.
Steve Jessop 2016 년

4
SO는 비공식적이며 비공식적으로 보이도록 작성되었습니다. 이제 cplusplus.com이 정확한 문서 / 참조 자료가 아니고 공정한 면책 조항을 놓친 경우 사이트 자체가 아닌 다른 방식으로 사용하는 사람들에게 돌을 던질 것이라고 가정하십시오. 그러나 요점은 cplusplus.com이 C ++ 함수에 대해 말하는 것이 사실이 아니라는 것을 의미하기 때문에 빠른 참조로 사용할 계획이라면 알 가치가 있다는 것입니다. 함수 시그니처를 조회하는 데 사용하지만 코드가 준수하는지 여부를 세밀하게 결정하지는 않습니다.
Steve Jessop 2016 년

14

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

"겹치는 객체간에 복사가 발생하면 동작이 정의되지 않습니다."라고 언급하지 않습니다. (C89 표준의 4.11.2.4. C ++ 03이 실제로 참조하는 C90의 사본을 가지고 있지 않지만 페이지 번호 매기기와 같은 내용에서만 다를 수 있습니다.)


아, 오래된 C 라이브러리 ... 좋아.
Kerrek SB 2016

6
그들은 언급한다 destination and source shall not overlap.
스나이퍼

2
@Sniper "겹치지 않아야 합니다 "는 "동작이 정의되지 않았습니다"와 다릅니다. 귀하의 의견은 실제로 cplusplus.com의 미묘하고 널리 퍼진 실패 중 하나를 밝힙니다. 올바르게 들리지만 정확하지 않습니다.
Andrew Henle

@ 스나이퍼 : 2011 년에이 답변을했을 때 말하지 않았다고 생각합니다. 입력에 대한 충분한 제약으로 "겹치지 않아야합니다".
Steve Jessop

9

cplusplus.com에서 제공 한 설명서는 종종 부정확하거나 불완전합니다.

그러한 예가 atoi나오면 cplusplus.com 의 문서입니다.

atoi
리턴 섹션에서 함수를 사용하는 동안 변환을 수행 할 수없는 경우 약 0의 리턴 값에 대한 언급이 없습니다.

cplusplus.com 리턴 섹션에 "... 변환 된 값이 int에 의해 표현 가능한 값 범위를 벗어나면 정의되지 않은 동작이 발생합니다."

표준 " 문자열의 숫자 값을 int로 표현할 수없는 경우, 동작은 정의되어 있지 않습니다 "에 따라 이는 정확합니다 .

그러나 반환 값으로 0을 언급하지 않으므로 섹션이 가득 차지 않아 잘못 될 수 있습니다. "... 변환이 수행되지 않고 0이 리턴됩니다." 설명 단락에서 이전에 충족되었지만 반환 섹션 에 있어야합니다 .

cplusplus.com에 제공된 많은 샘플 소스 코드가 올바르지 않습니다.
이 참고 문헌을 찾는 많은 초보자들은 확실한 오류를 일으 킵니다.

예를 들자면 :

편집 : 이전에 인용 한 예가 잘못되었습니다.


5
아마도 ballant-> 뻔뻔한가? 그러나 ballant는 "댕글 링 (dangling)"이라는 프랑스어 단어로, 포인터와 관련된 오류에 대한 제안 일 수 있습니다.
hardmath

반복자 예제를 다시 읽으십시오 ... 정의되지 않은 동작이 없습니다.
Dennis Zickefoose 2016 년

1
"cplusplus.com에 제공된 많은 샘플 소스 코드가 잘못되었습니다." 그런 다음 "이전에 인용 한 예가 잘못되었습니다."라는 예를 제거했습니다. -왜 예제를 제거 했습니까? :)
user2962533

이 사이트에 따르면, 설명하는 경우 정의되지 않은 리턴 유형이 정의되지 않은 동작이됩니다. en.cppreference.com/w/cpp/string/byte/atoi ; 그러나 Cplusplus.com이 귀하의 말과 일치하도록 설명서를 업데이트 한 것 같습니다. 분명히 그들은 지역 사회의 수정 요청에 응답합니다. 그럼에도 불구하고 문제의 두 사이트가 매우 다른 것을 나타 내기 때문에 어떤 웹 사이트가 가장 정확한지 잘 모르겠습니다.
shawn1874

이 답변이 게시 된 지 9 년이 지났습니다. Cplusplus.com에 상당량의 부정확하거나 불완전한 정보가 포함되어 있다고 일반적으로 믿습니까?
Tyler Shellberg

3

설명서는 먼저 type_info설명 을 시도 typeid하지만 실패합니다.

typeid는 형식에 직접 적용 할 수 있으며이 경우 정보를 반환합니다. 또는 객체의 경우 객체 유형에 대한 정보를 반환합니다.

다형 클래스 유형의 객체 (가상 함수를 선언하거나 상속하는 클래스)에 대한 역 참조 된 포인터에 typeid를 적용하면 동적 유형 (가장 파생 된 객체의 유형)을 고려합니다.

이제 두 번째 단락은 첫 번째 단락에 이미 동의하지 않습니다. 에서는 typeid(*ptr), typeid표현식에 적용된다. 유형 static과 개념의 개념은 dynamic객체가 아니라 표현의 맥락에서만 의미가 있기 때문에 이것은 필수적 입니다. 또한와 같은 경우가 없습니다 typeid(foo()).

또한 두 번째 단락은 참조를 생략합니다. 그것들은 그들이 참조하는 객체의 동적 유형과 다른 정적 유형을 가질 수 있습니다.


아주 좋은-RTTI 질문은 예측 가능한 규칙 성과 함께 SO에 관한 것입니다. 참조 하지 말아야 할 것을 아는 것이 좋습니다 .
Kerrek SB 2016

3

문서에 std::pair<T1,T2>::operator==따르면 두 요소가 모두 같은지 테스트되었습니다. 문서에 std::pair<T1,T2>::operator<따르면 두 번째 요소는 첫 번째 요소가 동일한 경우에만 고려됩니다.

두 경우 모두 "같음"이라는 단어가 나타납니다. 그러나 첫 번째 경우에만 실제로 의미 T::operator==합니다. 두 번째 경우, 동등한 의미!(a.first<b.first || b.first<a.first)


이 기능이 필수입니까, 아니면 operator==운영자가 이용 가능한 경우 라이브러리를 두 번째 경우에 자유롭게 사용할 수 있습니까?
Kerrek SB 2016

1
필수. C ++ 표준은 혼합하지 않습니다 operator==operator<.
MSalters 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.