Câu hỏi Tại sao một không gian tên không tên là một "cấp trên" thay thế cho tĩnh? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:

Phần $ 7.3.1.1 / 2 từ tiêu chuẩn C ++ đọc:

Việc sử dụng từ khóa tĩnh là   không được chấp nhận khi khai báo các đối tượng trong một   phạm vi không gian tên; không gian tên chưa đặt tên   cung cấp một sự thay thế vượt trội.

Tôi không hiểu tại sao một không gian tên không tên được coi là một sự thay thế vượt trội? Lý do cơ bản là gì? Tôi đã biết một thời gian dài như những gì tiêu chuẩn nói, nhưng tôi chưa bao giờ nghiêm túc nghĩ về nó, ngay cả khi tôi đã trả lời câu hỏi này: Tính ưu việt của không gian tên chưa được đặt tên trên tĩnh?

Nó được coi là cấp trên vì nó có thể được áp dụng cho các loại do người dùng định nghĩa, như tôi đã mô tả trong câu trả lời? Hoặc là có một số lý do khác là tốt, mà tôi không biết? Tôi hỏi điều này, đặc biệt vì đó là lý do của tôi trong câu trả lời của tôi, trong khi tiêu chuẩn có thể có một cái gì đó khác trong tâm trí.


76
2018-02-12 09:04


gốc


Tôi cũng muốn biết điều này. Tôi đoán nó chỉ tốt hơn vì tĩnh không được chấp nhận cho các định nghĩa chức năng. Ngoài ra bạn có một cách để xác định các lớp học địa phương với một không gian tên không tên. - frast
Tôi rất bối rối. Bạn dường như cung cấp một câu trả lời khá tốt cho câu hỏi khác. Chính xác những gì còn lại chưa được trả lời trong đầu bạn? - Marcelo Cantos
@Marcelo Cantos: Tôi đã chỉnh sửa câu hỏi của mình. :-) - Nawaz
Hoặc là stackoverflow.com/questions/4422507/… - James McNellis
Nếu bất cứ điều gì, câu hỏi này nên ở lại và 4422507 nên được đóng lại, bởi vì ở đây chúng ta thấy lý do thực sự được liệt kê và không chỉ là một con trỏ đến tiêu chuẩn. - Eli Bendersky


Các câu trả lời:


  • Như bạn đã đề cập, không gian tên hoạt động cho mọi thứ, không chỉ cho các hàm và đối tượng.
  • Như Greg đã chỉ ra, static có nghĩa là quá nhiều thứ rồi.
  • Không gian tên cung cấp một cách thống nhất và nhất quán để kiểm soát khả năng hiển thị ở phạm vi toàn cầu. Bạn không cần phải sử dụng các công cụ khác nhau cho cùng một điều.
  • Khi sử dụng một không gian tên vô danh, tên hàm / đối tượng sẽ bị xáo trộn đúng cách, cho phép bạn thấy một cái gì đó như "(không gian tên ẩn danh) :: xyz" trong bảng ký hiệu sau khi cắt xén, và không chỉ "xyz" với liên kết tĩnh .
  • Như đã chỉ ra trong các bình luận dưới đây, nó không được phép sử dụng những thứ tĩnh như các đối số mẫu, trong khi với các không gian tên vô danh thì nó vẫn ổn.
  • Hơn? Có lẽ, nhưng tôi không thể nghĩ ra bất cứ điều gì khác ngay bây giờ.

85
2018-02-12 10:22



+1. Ngoài ra, C ++ không cho phép các kiểu và con trỏ / tham chiếu đến các đối tượng hoặc hàm có liên kết nội bộ (tĩnh) được sử dụng làm tham số mẫu. Thay thế tĩnh với không gian tên ẩn danh vẫn "ẩn" những thứ từ các đơn vị dịch khác nhưng chúng giữ liên kết bên ngoài (chủ yếu) và có thể được sử dụng làm đối số mẫu. Nhưng tôi muốn nói mục đích chính của các không gian tên vô danh có lẽ là để loại bỏ một trong những ý nghĩa quá tải của tĩnh. - sellibitze
@ sellibitze: Đó là điểm rất tốt. Cảm ơn vì điều đó. - Nawaz
@sellibitze, rất thú vị, thêm rằng để trả lời. Chỉ cần một điểm để làm rõ: bạn có ý nghĩa gì bởi "loại có liên kết nội bộ"? Không phải là một trong những điểm mà các loại không thể có liên kết nội bộ (tĩnh?)? - Sergey Tachenov
Đây có lẽ là một sai lầm về phía tôi. Tôi chỉ cần kiểm tra một dự thảo tiêu chuẩn C + + và có vẻ như các loại tên luôn có liên kết bên ngoài. Nhưng định nghĩa về liên kết bên trong và bên ngoài có nghĩa là có một chút tương phản khi kết hợp với những không gian tên vô danh nào đạt được. - sellibitze
@ sellibitze, kiến ​​thức của tôi về điều liên kết là một chút mờ, nhưng tôi đã nhận thấy rằng readelf -s đầu ra LOCAL trong cột "Bind" cho cả biến tĩnh và ẩn tên. Đối với các biến toàn cầu, nó nói GLOBAL. Nhưng điều đó không ngăn GCC cho phép các biến ẩn danh không có tên như các đối số mẫu, trái ngược với các biến tĩnh, do đó, điểm của bạn vẫn hợp lệ. - Sergey Tachenov


Một lý do có thể là static đã có quá nhiều ý nghĩa (tôi có thể đếm ít nhất ba). Vì một không gian tên ẩn danh có thể gói gọn bất cứ thứ gì kể cả các loại, nó có vẻ vượt trội hơn static dung dịch.


9
2018-02-12 09:10



"static đã có quá nhiều ý nghĩa (tôi có thể đếm ít nhất ba)."Tôi chỉ thấy 2 khác nhau ý nghĩa. - curiousguy
@curiousguy: liên kết biểu tượng; biến cố định cục bộ; phương thức lớp. - Greg Hewgill
Tôi thấy hàm "biến cố định" và hàm thành viên tĩnh như trường hợp của cùng một ý tưởng: một khai báo nằm bên trong một phạm vi (hàm hoặc lớp), nhưng hành vi thời gian chạy của nó không phải là hành vi thông thường của khai báo trong phạm vi đó. BTW, toán tử lớp cụ thể mới và xóa thường không được khai báo tĩnh, nhưng luôn tĩnh theo định nghĩa. - curiousguy
@curiousguy: Có không gian tên-tĩnh, có nghĩa là lưu trữ cho đối tượng toàn cục bị hạn chế đối với đơn vị dịch. Có thành viên-tĩnh, có nghĩa là thành viên của lớp không phải là một phần của cá thể lớp (và các hàm thành viên tĩnh không nhận được this). Và có địa phương tĩnh, có nghĩa là biến được xác định là liên tục trên các cuộc gọi hàm, nhưng nó cả đời chỉ bắt đầu lần đầu tiên nó gặp phải. Tuổi thọ của không gian tên-tĩnh bắt đầu vào lúc bắt đầu thực hiện chương trình, trước khi chính (giống như các hình cầu thông thường). Vì vậy, không, đó là 3 định nghĩa. - Nicol Bolas
@NicolBolas Đúng vậy, có 3 định nghĩa không thể được thống nhất hoàn toàn, nhưng hai định nghĩa cuối cùng có liên quan. Chỉ có 2 cách sử dụng hoàn toàn không liên quan static: "bị hạn chế đối với đơn vị dịch"và" không phải là quy tắc suốt đời bình thường ". - curiousguy


Có hai lý do tôi nghĩ:

  • static có hai ý nghĩa khác nhau: ở phạm vi lớp, nó có nghĩa là chia sẻ bởi cả lớp trong khi ở phạm vi tập tin / chức năng nó ảnh hưởng đến khả năng hiển thị / lưu trữ ...
  • các không gian tên chưa được đặt tên cho phép khai báo mới struct, class và typedef

Một lưu ý mặc dù, các commitee backpedaled về điều này: static không còn được đánh dấu là không được chấp nhận nữa n3225.


5
2018-02-12 10:23



Bạn có thể vui lòng giải thích về điểm thứ hai không? - Nawaz
@Nawaz: namespace { typedef int MyType; } ? Hoặc commitee loại bỏ deprecated chú thích ? - Matthieu M.
dấu đầu dòng thứ hai. :-) - Nawaz


Dù họ có lý do gì, họ vẫn đổi ý: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/


3
2018-02-12 14:06



Đọc của tôi về nó là họ đã thay đổi suy nghĩ của họ về việc không dùng nó, không phải là liệu tốt hơn là sử dụng các không gian tên không tên. - Marcelo Cantos