2008-10-06 34 views
22

Theo mặc định, trong C++, một hàm tạo đối số đơn có thể được sử dụng như một toán tử chuyển đổi ngầm định. Điều này có thể bị triệt tiêu bằng cách đánh dấu hàm khởi tạo là tường minh.Buộc các hàm tạo đối số đơn phải rõ ràng trong C++?

Tôi muốn đặt "rõ ràng" là mặc định, để trình biên dịch không thể sử dụng âm thầm các hàm tạo này để chuyển đổi.

Có cách nào để thực hiện điều này trong C++ chuẩn không? Không có điều đó, là có một pragma (hoặc tương tự) mà sẽ làm việc trong Microsoft C + + để làm điều này? Điều gì về g + + (chúng tôi không sử dụng nó, nhưng nó có thể là thông tin hữu ích)?

Trả lời

17

Không, bạn phải làm tất cả bằng tay. Đó là một nỗi đau, nhưng bạn chắc chắn sẽ nhận được trong thói quen làm cho các nhà thầu đối số duy nhất rõ ràng. Tôi không thể tưởng tượng nỗi đau bạn sẽ có nếu bạn đã tìm thấy một giải pháp và sau đó đã phải chuyển mã vào một nền tảng khác. Bạn thường nên tránh xa các phần mở rộng trình biên dịch như thế này bởi vì nó sẽ làm cho mã ít di động hơn.

+1

Thành thật mà nói, chúng tôi không quá bận tâm về tính di động; chúng tôi là một cửa hàng Windows. Điều đó không có nghĩa là chúng ta không quan tâm; nó có nghĩa là, một khi bạn đã chọn cho khung công tác Win32 GUI, hỗ trợ Linux hoặc OSX là học tập. –

+1

Tính di động không chỉ là vấn đề nền tảng. Có các trình biên dịch khác có sẵn cho các cửa sổ, ví dụ. Intel, MinGW. Ngoài ra còn có khả năng tương thích ngược trong các phiên bản mới của trình biên dịch Microsofts. Sự bảo đảm duy nhất bạn có là Ủy ban C++ suy nghĩ rất cẩn thận trước khi phá vỡ mã C++ hiện có. –

+0

Chỉ cần làm rõ, tôi không gợi ý rằng Microsoft sẽ phá vỡ mã người mà không suy nghĩ, tuy nhiên, họ có những áp lực khác nhau đối với ủy ban của tiêu chuẩn. –

0

Tôi nghĩ câu trả lời là không!

Xin lỗi, đây không phải là câu trả lời mang tính xây dựng. Tôi hy vọng người khác có thể biết nhiều hơn!

0

Không có tùy chọn nào có sẵn trong tiêu chuẩn C++ và tôi cũng không tin có trong Visual Studio.

1

Có thể khá khó chịu đối với bất kỳ tiêu đề nào bạn có. Giống như <vector> hoặc bất kỳ tiêu đề Tăng cường nào. Nó cũng sẽ gây ra một số báo cáo sai. Vì vậy, không, tôi không mong đợi một trình biên dịch để thêm một #pragma như vậy.

1

Không có tùy chọn như vậy trong trình biên dịch, theo như tôi biết. Nhưng có một cảnh báo Lint cho các trường hợp như vậy (xem http://www.gimpel.com/lintinfo.htm).

1

Nếu có tùy chọn pragma hoặc dòng lệnh đã tạo các hàm tạo theo mặc định, làm cách nào bạn khai báo một hàm không rõ ràng? Sẽ phải có một mã thông báo cụ thể của trình biên dịch hoặc pragma để làm cho nó có thể khai báo một hàm tạo chuyển đổi ngầm.

+1

Tôi thích điều đó. Đó là một trong những khẩu súng của Raymond Chen. "Tôi có thể làm điều này hay không? Vâng, hãy tưởng tượng * rằng bạn có thể *, sau đó ..." –

+1

Tôi nhận được những gì bạn đang nói. Với tùy chọn dòng lệnh, điều này sẽ đúng. Với một pragma, bạn có thể tắt nó đi sau. Hoặc với MSVC, bạn có thể sử dụng các phần mở rộng __pragma hoặc __declspec có thể được giới hạn trong lớp hiện tại (c.f. __declspec (novtable)). –

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