2011-07-21 19 views
22

thể trùng lặp:
What does the explicit keyword in C++ mean?C++ từ khóa rõ ràng cho chức năng không có đối số

Có một lý do để sử dụng từ khóa explicit cho một chức năng mà không mất bất kỳ đối số? Nó có tác dụng gì không? Tôi đang tự hỏi vì tôi vừa bắt gặp dòng

explicit char_separator()

gần cuối của tăng trang chủ tài liệu :: char_separator (http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm), nhưng nó không giải thích thêm nữa đó.

+6

Không phải là bản dupe; câu hỏi này là về một trường hợp góc rất cụ thể của từ khóa 'tường minh'. –

+4

Đó không phải là chức năng, đó là hàm tạo - xem http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean/121163#121163 – Skizz

+0

@larsmans Khó nói mà không thấy một số ví dụ thực tế –

Trả lời

14

Reading explanation of members:

explicit char_separator(const Char* dropped_delims, 
         const Char* kept_delims = "", 
         empty_token_policy empty_tokens = drop_empty_tokens) 
explicit char_separator() 

Từ khóa explicit cho các nhà xây dựng 1 đòi hỏi sự sáng tạo rõ ràng các đối tượng của loại char_separator. What does the explicit keyword mean in C++? bao gồm từ khóa rõ ràng rất tốt.

Từ khóa explicit cho hàm tạo thứ 2 là tiếng ồn và bị bỏ qua.

EDIT

Từ C++ tiêu chuẩn:

7.1.2 p6 nói:

Từ khoá rõ ràng sẽ chỉ được sử dụng trong tờ khai của nhà xây dựng trong một khai báo lớp; xem 12.3.1.

12.3.1 p2 nói:

Một constructor rõ ràng cấu trúc vật thể giống như phi rõ ràng nhà thầu, nhưng làm như vậy chỉ nơi trực tiếp khởi tạo cú pháp (8,5) hoặc trong trường hợp phôi (5.2. 9, 5.4) được sử dụng một cách rõ ràng. Một hàm tạo mặc định có thể là một hàm tạo rõ ràng; một hàm tạo như vậy sẽ là được sử dụng để thực hiện khởi tạo mặc định hoặc khởi tạo giá trị (8.5). [Ví dụ:

class Z { 
public: 
explicit Z(); 
explicit Z(int); 
// ... 
}; 
Z a;    // OK: default-initialization performed 
Z a1 = 1;   // error: no implicit conversion 
Z a3 = Z(1);  // OK: direct initialization syntax used 
Z a2(1);   // OK: direct initialization syntax used 
Z* p = new Z(1); // OK: direct initialization syntax used 
Z a4 = (Z)1;  // OK: explicit cast used 
Z a5 = static_cast<Z>(1); // OK: explicit cast used 

-end dụ]

Vì vậy, các nhà xây dựng mặc định với từ khóa explicit cũng giống như không có từ khóa này.

Các vấn đề liên quan