Có gì sai với cplusplus.com?


200

Đây có lẽ không phải là một diễn đàn hoàn toàn phù hợp cho câu hỏi này, nhưng hãy để tôi cho nó một cú đánh, có nguy cơ bị chuyển đi.

Có một số tài liệu tham khảo cho thư viện chuẩn C ++, bao gồm tiêu chuẩn ISO vô giá, MSDN , IBM , cppreference , và cplusplus . Cá nhân, khi viết C ++, tôi cần một tài liệu tham khảo có quyền truy cập ngẫu nhiên nhanh chóng, thời gian tải ngắn và ví dụ sử dụng và tôi đã tìm thấy cplusplus.com khá hữu ích. Tuy nhiên, tôi đã nghe những ý kiến ​​tiêu cực về trang web đó thường xuyên ở đây trên SO, vì vậy tôi muốn biết cụ thể:

Các lỗi, quan niệm sai lầm hoặc những lời khuyên tồi tệ được đưa ra bởi cplusplus.com là gì? Những rủi ro của việc sử dụng nó để đưa ra quyết định mã hóa là gì?

Hãy để tôi thêm điểm này: Tôi muốn có thể trả lời các câu hỏi ở đây trên SO với các trích dẫn chính xác của tiêu chuẩn, và do đó tôi muốn đăng các liên kết có thể sử dụng ngay lập tức và cplusplus.com sẽ không phải là trang web tôi chọn vấn đề này.


62
Tại sao các downvote? Đây là một câu hỏi hoàn toàn hợp lệ. Nếu bạn cần một tài liệu tham khảo, bạn muốn có một nguồn đáng tin cậy. Tôi cũng đã nghe các khiếu nại chống lại cplusplus.com, nơi tôi có thể nhận được một tài liệu tham khảo nhanh cho thư viện tiêu chuẩn và như vậy, điều này thật thú vị.
Xèo

48
@Olafur: Tôi không muốn có ý kiến, tôi muốn có danh sách cụ thể về các lỗi trên trang web đó. Nếu không có gì, tôi muốn có thể sử dụng câu hỏi này để xua tan những lời chỉ trích trong tương lai.
Kerrek SB

4
@ Ólafur Chờ đợi: có thể. Nhưng điểm hoàn toàn khách quan có thể được thực hiện về tính chính xác / trung thực của nội dung của trang web đó.
Daniel Sloof

14
Chúng tôi đã ở trang một cho "cplusplus.com" trên Google. Thật ấn tượng khi các câu hỏi SO nhanh chóng leo lên bảng xếp hạng tìm kiếm.
Các cuộc đua nhẹ nhàng trong quỹ đạo

5
Tôi nghĩ thật công bằng - được đưa ra mức độ cao của câu hỏi này đối với các tìm kiếm cho "cplusplus" - để lưu ý rằng, vì câu hỏi này đã được hỏi, một số sửa đổi đã được thực hiện cho cplusplus.com. Trong thực tế, ba câu trả lời hàng đầu chỉ ra sai lầm không còn đúng nữa.
Đánh dấu ngày

Câu trả lời:


72

Chỉnh sửa: Tài liệu cho std::removeđã được sửa chữa vì câu trả lời này đã được viết. Điều tương tự áp dụng cho list::remove.

Hãy để tôi cho bạn một ví dụ để cho bạn thấy làm thế nào cpluscplus.com có ​​thể hiểu sai.

Xem xét std::removechức năng từ <algorithm>.

Thực tế là std::removekhông loại bỏ các mục từ container. Đó là bởi vì nó chỉ std::removehoạt động với một cặp vòng lặp và không biết gì về container thực sự chứa các vật phẩm. Trong thực tế, không thể std::removebiết được container bên dưới, bởi vì không có cách nào nó có thể đi từ một cặp trình vòng lặp để khám phá về container mà trình lặp đó thuộc về. Vì vậy, std::removekhông thực sự loại bỏ các mặt hàng, đơn giản là vì nó không thể . Cách duy nhất để thực sự loại bỏ một mục khỏi một container là gọi một hàm thành viên trên container đó.

Vì vậy, nếu bạn muốn xóa các mục, hãy sử dụng Xóa thành ngữ :

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

Nhưng cplusplus.comcung cấp thông tin không chính xác về std::remove. Nó nói rằng

Lưu ý rằng chức năng này không làm thay đổi các thành phần qua đầu mới, giữ các giá trị cũ của chúngvẫn có thể truy cập được .

Điều đó không đúng. Trình lặp trong phạm vi [new_end, old_end)vẫn có thể điều chỉnh được, nhưng điều đó KHÔNG có nghĩa là chúng giữ các giá trị cũ và vẫn có thể truy cập được. Chúng không được chỉ định.


Tương tự, cplusplus.comcung cấp thông tin không chính xáclist::remove là tốt. Nó nói ,

Lưu ý rằng một hàm thuật toán toàn cầu, loại bỏ, tồn tại với một hành vi tương tự nhưng hoạt động giữa hai lần lặp.

Điều đó là hoàn toàn sai. Loại bỏ toàn cầu cụ thể std::removelà không giống với list::remove, như chúng ta đã thấy rằng cái trước KHÔNG thực sự loại bỏ các mục khỏi container vì nó không thể , trong khi cái sau (chức năng thành viên) thực sự loại bỏ các mục vì nó có thể .

Câu trả lời này được sao chép từ một câu trả lời khác của tôi trong chủ đề sau, với một chút sửa đổi:

Lưu ý: Vì tôi đã bắt gặp điều này gần đây khi tôi trả lời trong chủ đề trên, tôi nhớ nó. Có rất nhiều lỗi mà tôi đã gặp trong hai năm qua, mà tôi không nhớ. Tôi có thể thêm vài lần sau, nếu tôi gặp lại.


1
+1: có nhiều hơn những tuyên bố không chính xác trên trang web này không?
Klaim

4
@Alexander: list::removekhông loại bỏ các thành phần khỏi container. Nhưng std::removeKHÔNG loại bỏ các yếu tố từ container. Tôi không thể nói hành vi của họ là "tương tự".
Nawaz

3
Bắt tốt đẹp! Đó là một ví dụ rất hay về những điều tôi đang tìm kiếm.
Kerrek SB

3
"Tương tự" có thể gây tranh cãi, vì đó là vấn đề quan điểm liệu hai hoạt động khác nhau có giống nhau hay không. Cũng có thể tranh luận liệu cplusplus.com có ​​nên đưa ra ý kiến ​​được ngụy trang thành tài liệu hay không. Nhưng dù sao đi nữa, "giữ giá trị cũ của họ" là một lỗi không thể tha thứ, nó chỉ cho thấy rằng mô tả thặng dư không dựa trên tiêu chuẩn.
Steve Jessop

5
@Steve: Bạn nói "Similar" is debateable. Nếu từ similarnày gây tranh cãi, thì rất nhiều người nói rằng từ này không phải là từ chính xác và nên tránh khi giải thích hành vi của std::removelist::remove, bởi vì một lời giải thích nên càng rõ ràng càng tốt, nó không nên yêu cầu một lời giải thích khác.
Nawaz

38

Tôi sẽ đưa ra một ý kiến ​​hơi ngược lại. Có rất nhiều thông tin tốt trên cplusplus.com. Chọn nó cho đến chết, và vâng, tất nhiên nó có vấn đề, nhưng trang web nào không? Chắc chắn không phải trang web này . Những người sống trong nhà kính không nên ném đá. Có rất nhiều thông tin sai ở đây, quá. Có những câu trả lời được chấp nhận là không đúng, câu trả lời bị bỏ qua (một số câu phủ định!) Là đúng tại chỗ.

Một vấn đề với cplusplus.com là nó là một trang web đóng; điều tương tự cũng xảy ra với hầu hết các trang web tham khảo khác được đề cập. Điều này đi ngược lại với các trang web do cộng đồng phát triển, chẳng hạn như Stack Overflow. Có được khả năng thực hiện các chỉnh sửa đáng tin cậy không mất nhiều thời gian và ngay cả những người mới nhất cũng có thể dễ dàng đưa ra đề xuất cải tiến. So sánh điều đó với cplusplus.com. Bạn là người mới vĩnh viễn nếu bạn không thuộc biên chế của họ. Ngay cả khi bạn là thành viên chủ chốt của WG21, bạn phải thông qua cơ chế báo cáo email của họ nếu bạn thấy một lỗi nào đó trong trang web đó. Vô cảm!

Một giải pháp sẽ là cho chúng tôi tại trang web này để phát triển tài liệu tham khảo C ++ của riêng chúng tôi. Điều này sẽ mất khá nhiều công việc. Chúng ta phải cẩn thận để không quá khoa trương / quá kỹ thuật; rõ ràng là cplusplus.com sử dụng ít nhất một vài biên tập viên kỹ thuật, những người giữ cho các nhà giáo ở lại. Chúng tôi phải giữ thông tin được tổ chức tốt; Câu hỏi thường gặp ở đây không được tổ chức tốt. Chúng tôi cũng phải hết sức cẩn thận để không phun quá nhiều trực tiếp từ tiêu chuẩn; đó là bất hợp pháp.


7
Tôi đã từng sử dụng cppreference.com cũ, nhưng bây giờ họ đã làm lại nó thành một cái gì đó wiki-ish (nó có mở để chỉnh sửa bởi mọi người không?) ... và tôi thực sự không thích nó nữa. Thật khó để xem thông tin quan trọng, tôi tìm thấy. Nó chỉ thiếu sự hài lòng ngay lập tức tôi nhận được từ cplusplus.com. Tôi nghĩ.
Kerrek SB

14
Ái chà! Tôi thấy chính xác điều ngược lại. Tôi đã dừng việc thường xuyên sử dụng cppreference.com cũ bởi vì tôi thấy nó khó để vượt qua và viết kém. Cppreference.com mới dường như là một trang web dựa trên cộng đồng, không có quảng cáo, thực hiện chính xác những gì tôi đề xuất trong đoạn cuối cùng của mình.
David Hammen

1
Có lẽ đó chỉ là tôi, tôi sẽ thử lại lần nữa. Tôi nghĩ rằng tôi muốn tìm kiếm một số <thread>hoặc <atomic>công cụ và chỉ cần "xin vui lòng viết trang này" vì vậy tôi đã từ bỏ. Để tôi kiểm tra lại! Ồ, hỗ trợ C ++ 0x tất nhiên sẽ là một phần thưởng khổng lồ!
Kerrek SB

10
"Những người sống trong nhà kính không nên ném đá." SO không tuyên bố là (một phần) một tài liệu tham khảo thư viện cho C ++ như cplusplus.com/reference hiện. Khi mọi người đưa ra yêu cầu ở đây, họ trích dẫn tiêu chuẩn để sao lưu hoặc nếu họ không có người khác đến và điền vào. Nếu họ sai, bạn có thể thấy họ làm việc. Nếu cplusplus.com sai, bạn vừa viết mã sẽ thất bại trong một số triển khai C ++ khác với mã mà tác giả đã sử dụng để tạo ra "mô tả chi tiết về các yếu tố của nó". Vấn đề là cplusplus.com là không chính thức, nhưng được viết để trông trang trọng.
Steve Jessop

4
SO là không chính thức, và được viết để nhìn không chính thức. Bây giờ, nếu cplusplus.com không có ý định là tài liệu tham khảo / tài liệu tham khảo chính xác và tôi đã bỏ lỡ từ chối trách nhiệm ở đâu đó thì đủ công bằng, giả sử bất kỳ viên đá nào được ném vào những người sử dụng nó theo cách đó chứ không phải chính trang web đó. Nhưng vấn đề là chỉ vì cplusplus.com nói điều gì đó về chức năng C ++ không có nghĩa là nó đúng và điều đáng biết là nếu bạn dự định sử dụng nó làm tài liệu tham khảo nhanh. Tôi sử dụng nó để tra cứu chữ ký hàm, nhưng không bao giờ giải quyết một điểm tốt cho dù mã của tôi có phù hợp hay không.
Steve Jessop

14

http://www.cplusplus.com/reference/cl Library / copes / strncpy /

Không thể đề cập rằng "Nếu việc sao chép diễn ra giữa các đối tượng trùng nhau, hành vi không được xác định." (4.11.2.4 trong tiêu chuẩn C89. Tôi không có bản sao của C90, đó là những gì C ++ 03 thực sự đề cập đến, nhưng chúng được cho là chỉ khác nhau ở những thứ như đánh số trang.)


À, thư viện C cũ ... đẹp đấy.
Kerrek SB

6
Họ đề cập đến destination and source shall not overlap.
Bắn tỉa

2
@Sniper "sẽ không trùng lặp" không giống như "hành vi không xác định". Nhận xét của bạn thực sự làm sáng tỏ một trong những thất bại tinh tế, lan tỏa của cplusplus.com - nghe có vẻ đúng, nhưng nó không đúng.
Andrew Henle

@Sniper: Tôi nghĩ có lẽ nó đã không nói rằng khi tôi đưa ra câu trả lời này vào năm 2011. Tôi sẽ lấy "sẽ không chồng chéo" như là ràng buộc đủ cho các đầu vào.
Steve Jessop

9

Các tài liệu được cung cấp bởi cplusplus.com thường không chính xác hoặc không đầy đủ.

Một khi ví dụ như vậy là, atoitài liệu trên cplusplus.com.

atoi
Trong phần Trả về, không có đề cập đến giá trị trả về 0 nếu không có chuyển đổi nào có thể được thực hiện trong khi sử dụng hàm.

cplusplus.com Phần trả về trạng thái "... Nếu giá trị được chuyển đổi sẽ nằm ngoài phạm vi của các giá trị đại diện bởi một int, nó gây ra hành vi không xác định."

Điều này là chính xác, theo tiêu chuẩn " Nếu giá trị số của chuỗi không thể được biểu thị bằng int, thì hành vi không được xác định ".

Tuy nhiên, phần này không đầy đủ vì nó không đề cập đến 0 là giá trị trả về, có thể gây hiểu nhầm. Cụm từ "... không có chuyển đổi nào được thực hiện và trả về 0". được đáp ứng trước trong đoạn mô tả, nhưng điều cần thiết là phải có nó trong phần Trả về .

Nhiều mã nguồn mẫu được đưa ra trên cplusplus.com là không chính xác.
Nhiều người mới tìm đến các tài liệu tham khảo này đã dẫn đến việc mắc lỗi ballant.

Để trích dẫn một ví dụ:

EDIT: Ví dụ tôi đã trích dẫn trước đây là không chính xác.


5
Có lẽ ballant -> trắng trợn? Tuy nhiên ballant là một từ tiếng Pháp có nghĩa là "lơ lửng", có thể là apropos cho các lỗi liên quan đến con trỏ.
hardmath

Đọc lại ví dụ lặp đó ... không có hành vi không xác định.
Dennis Zickefoose

1
Bạn đã tuyên bố "Nhiều mã nguồn mẫu được đưa ra trên cplusplus.com là không chính xác." và sau đó loại bỏ ví dụ nói rằng "Ví dụ tôi đã trích dẫn trước đây là không chính xác." - Tại sao bạn lại loại bỏ ví dụ? :)
dùng2962533

Theo trang web này, trường hợp bạn mô tả kết quả theo kiểu trả về không xác định không phải là hành vi không xác định. en.cppreference.com/w/cpp/opes/byte/atoi ; tuy nhiên, có vẻ như Cplusplus.com đã cập nhật tài liệu của mình để phù hợp với những gì bạn đang nói. Rõ ràng là họ đáp ứng yêu cầu của cộng đồng để sửa chữa. Tuy nhiên, tôi không chắc trang web nào là chính xác nhất bởi vì hai câu hỏi trong trạng thái rất khác nhau.
shawn1874

Đã 9 năm kể từ khi câu trả lời này được đăng. Có phải mọi người vẫn thường tin rằng Cplusplus.com chứa một lượng đáng kể thông tin không chính xác hoặc không đầy đủ?
Tyler Shellberg

3

Tài liệu cho type_info cố gắng giải thích typeidtrước, nhưng không thành công:

typeid có thể được áp dụng trực tiếp cho các loại, trong trường hợp đó nó trả về thông tin của nó; Hoặc cho các đối tượng, trong trường hợp đó, nó trả về thông tin về loại đối tượng.

Khi typeid được áp dụng cho một con trỏ được ước tính cho một đối tượng thuộc loại lớp đa hình (một lớp khai báo hoặc kế thừa một hàm ảo), nó xem xét kiểu động của nó (tức là loại của đối tượng dẫn xuất nhất).

Bây giờ đoạn thứ hai đã không đồng ý với đoạn đầu tiên. Trong typeid(*ptr), typeidđược áp dụng cho một biểu thức. Điều này là khá cần thiết, vì khái niệm staticdynamiccác loại chỉ có ý nghĩa trong bối cảnh biểu hiện, không phải đối tượng. Nó cũng bỏ lỡ trường hợp như thế typeid(foo()).

Hơn nữa, đoạn thứ hai bỏ qua các tài liệu tham khảo. Chúng cũng có thể có các kiểu tĩnh khác với kiểu động của đối tượng mà chúng tham chiếu.


Rất hay - Các câu hỏi RTTI xuất hiện trên SO với tính đều đặn có thể dự đoán được. Tốt để biết những gì không tham khảo.
Kerrek SB

3

Tài liệu của std::pair<T1,T2>::operator== nói rằng cả hai yếu tố được kiểm tra cho sự bình đẳng. Tài liệu std::pair<T1,T2>::operator<nói rằng các yếu tố thứ hai chỉ được xem xét nếu các yếu tố đầu tiên bằng nhau.

Từ "bằng" xuất hiện trong cả hai trường hợp. Tuy nhiên, chỉ trong trường hợp đầu tiên nó thực sự có nghĩa T::operator==. Trong trường hợp thứ hai, phương tiện bằng nhau!(a.first<b.first || b.first<a.first)


Đây có phải là bắt buộc, hoặc thư viện sẽ được sử dụng miễn phí operator==trong trường hợp thứ hai nếu nhà điều hành có sẵn?
Kerrek SB

1
Bắt buộc. Tiêu chuẩn C ++ không trộn lẫn operator==operator<.
MSalters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.