2011-09-19 30 views
7

Trong một số GoogleTechTalks video on Youtube, Bjarne Stroustrup nói về chuẩn C++ 0x sắp tới. Trong đoạn video, ông đề cập đến ví dụ sau:Ví dụ này về việc sử dụng từ khóa C++ 'tường minh' có chính xác không?

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << d << "\n"; } 
    explicit Sick(int i) { std::cout << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2.1; 
    Sick s2(2.1); 
} 

Ông ấy có nghĩa là để đặt các từ khóa explicit trước Sick(double) hơn Sick(int), để làm nổi bật vấn đề liên quan đến chuyển đổi tiềm ẩn trong những bối cảnh nhất định?

+3

Làm cách nào để biết ai đó trong video trên youtube có nghĩa là gì? Điều quan trọng là * bạn * hiểu việc sử dụng 'tường minh' trong ví dụ này. –

+2

Hoặc là hợp lý, tùy thuộc vào những gì bạn muốn hiển thị với ví dụ. – Flexo

+3

@Kerrek SB, Bạn giả sử biết ý anh ấy là gì vì anh ta đang cố truyền đạt ý của mình. – ikegami

Trả lời

9

Trong thảo luận của ông, Stroustrup đề cập rằng một khởi trực tiếp, chẳng hạn như

Sick s2(2.1); 

sẽ xem xét chỉ constructors đánh dấu explicit nếu có bất kỳ explicit nhà xây dựng. Đó không phải là kinh nghiệm của tôi với một số trình biên dịch (bao gồm GCC 4.6.1 và MSVC 16/VS 2010), và tôi không thể tìm thấy một yêu cầu như vậy trong tiêu chuẩn (mặc dù tôi muốn được quan tâm nếu ai đó có thể chỉ ra nó).

Tuy nhiên, nếu ints được sử dụng trong initializers, tôi nghĩ rằng ví dụ này sẽ hiển thị những gì Stroustrup có nghĩa là để chứng minh:

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << "double " << d << "\n"; } 
    explicit Sick(int i) { std::cout << "int " << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2; 
    Sick s2(2); 
} 

Chạy sẽ hiển thị trên:

double 2 
int 2 

Cho thấy rằng hai dường như các khởi tạo tương đương thực sự chọn các hàm tạo khác nhau.

(Hoặc như Truncheon đã đề cập trong câu hỏi - và tôi đã bỏ lỡ - rằng từ khóa explicit phải ở trên công cụ xây dựng Sick(double d)).