Làm thế nào để tìm ra các chức năng mà trình biên dịch tạo ra?


11

Tôi biết về các hàm do trình biên dịch tạo ra, quy tắc ba và quy tắc năm. Trong các kịch bản trong thế giới thực, có thể không quan trọng để tìm ra chính xác các hàm do trình biên dịch tạo ra (hàm tạo, toán tử gán, hàm hủy) thực sự được tạo bởi trình biên dịch.

Có cách nào để liệt kê các hàm do trình biên dịch tạo cho một lớp cụ thể không?

Tôi chủ yếu quan tâm đến Visual Studio 2019 và Xcode, nhưng một giải pháp chung sẽ còn được chào đón hơn nữa.

Câu trả lời:


11

Các quy tắc rất phức tạp. Tôi sẽ đánh cắp từ một câu trả lời khác trích dẫn một bảng từ bài thuyết trình của Howard Hinnant .

nhập mô tả hình ảnh ở đây

Đạo đức ở đây là một thực hành tốt là không dựa vào trình biên dịch ngầm tuyên bố và tuyên bố rõ ràng mọi thành viên đặc biệt (như mặc định hoặc bị xóa, tùy thuộc vào nhu cầu của bạn)


Nếu bạn khai báo rõ ràng mọi thành viên đặc biệt, bạn sẽ mất trạng thái thành viên đặc biệt "không khai báo" đối với hàm tạo và toán tử gán.
Maxim Egorushkin

@MaximEgorushkin Quan điểm của tôi là khai báo chúng mặc định nếu bạn cần chúng (mặc dù mặc định vẫn có thể không được khai báo) hoặc bị xóa nếu bạn không muốn chúng.
bolov

2
@bolov Biểu đồ rất hữu ích nhưng điều này không trả lời câu hỏi của tôi. Tôi muốn tìm ra các hàm thực sự được tạo bởi trình biên dịch. Nói cách khác: Tôi không hỏi về những gì nên xảy ra trong lý thuyết, nhưng những gì đang xảy ra trong thực tế.
Helge Klein

1
@ tjwrona1992: Theo lập luận đó, chúng tôi sẽ không bao giờ cần kiểm tra mã của chúng tôi, vì chúng tôi biết rằng nếu trình biên dịch đã làm bất cứ điều gì khác với dự định thì phải có lỗi trong đó.
ruakh

1
@ tjwrona1992: Vâng, chính xác. Tương tự như vậy, điểm nhìn thấy những gì trình biên dịch của bạn đã tạo ra không phải để xác minh rằng trình biên dịch là chính xác, mà là để xác minh rằng bạn đã cung cấp trình biên dịch với đầu vào chính xác.
ruakh

7

"Có cách nào để liệt kê các hàm do trình biên dịch tạo cho một lớp cụ thể không?"

Tất nhiên là có. Trên Linux (và các hệ thống Unix khác), bạn có thể sử dụng nm, readelfobjdumptrên tạo ra các file đối tượng / thư viện / thực thi để tháo rời họ và kiểm tra bất kỳ biểu tượng xuất khẩu (và nhiều hơn nữa).

Có những công cụ tương tự trên Windows , tôi biết, nhưng đó không phải là một nền tảng tôi làm việc nhiều, vì vậy thật không may là tôi không thể đặt tên chính xác cho tên công cụ ở đó.


1
Mặc dù các công cụ này rất có thể không hiển thị cho bạn những chức năng nào có thể được tạo ra (nghĩa là trình biên dịch được phép tạo ra chúng, nhưng bạn không bao giờ sử dụng các chức năng đó nên nó đã quyết định không làm phiền hoặc loại bỏ mã thời gian liên kết đã loại bỏ chúng)
JMAA

@JMAA Trong hầu hết các trường hợp, "được phép tạo nhưng không bao giờ được sử dụng" theo thuật ngữ Tiêu chuẩn có nghĩa là một hàm được "khai báo ngầm" nhưng không được "định nghĩa ngầm". Vâng, điều này vẫn có nghĩa là bạn sẽ không nhìn thấy các biểu tượng, ngay cả khi nội tuyến bị vô hiệu hóa.
aschepler

1
Nói đúng ra, câu trả lời này trả lời chính xác hơn cho câu hỏi được hỏi: "Trình biên dịch đã tạo ra phương thức nào?" Điều đó không giống với câu hỏi ít chính xác hơn "Những phương thức nào có thể được trình biên dịch tạo ra trong một bối cảnh khác nhau?"
rici

@rici Đúng. Nhưng câu hỏi chính xác hơn không dễ trả lời, vì vậy tôi đã đi tìm những gì có thể trả lời được. Vui lòng downvote nếu bạn nghĩ rằng câu trả lời của tôi không có giá trị.
Jesper Juhl

1
@jesper: không, tôi đã nâng cấp. Tôi nghĩ rằng câu hỏi bạn trả lời chính xác hơn, như tôi đã nói. Một câu hỏi khác, có thể là ý định, đòi hỏi một số cách xử lý vì nó trái ngược nhau: chúng ta không biết bối cảnh giả thuyết nào có thể bao gồm. Nhưng đây là câu hỏi theo nghĩa đen, có chủ ý hay không, vì vậy nên trả lời nó.
rici

1

Đây hiện chỉ là một câu trả lời một phần.

Phòng thu hình ảnh 2019

Người xây dựng

Khi xác định một đối tượng lớp, hàm IntelliSense của Visual Studio hiển thị các hàm tạo có sẵn, cả do trình biên dịch tạo và của riêng bạn:

nhập mô tả hình ảnh ở đây

Thông tin này không phải lúc nào cũng đưa ra, thật không may. Để làm cho nó hoạt động cho ảnh chụp màn hình ở trên, tôi đã phải gõ một cái gì đó trong ngoặc đơn, do đó là dấu phẩy.

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.