Nói chung, nó đề cập đến việc làm cho một hàm không sử dụng được, ví dụ nếu bạn muốn cấm sử dụng cấp phát động trong một chương trình, bạn có thể "đầu độc" malloc
hàm để nó không thể được sử dụng.
Trong video, anh ấy đang sử dụng nó theo một cách cụ thể hơn, điều này rõ ràng nếu bạn đọc trang trình bày được hiển thị khi anh ấy nói về việc đầu độc hàm, có nội dung "Một cách chỉ buộc thời gian biên dịch?"
Vì vậy, anh ấy đang nói về việc "đầu độc" hàm để làm cho nó không thể gọi được trong thời gian chạy, vì vậy nó chỉ có thể gọi trong các biểu thức không đổi. Kỹ thuật này là để có một nhánh trong hàm không bao giờ được sử dụng khi được gọi trong bối cảnh thời gian biên dịch và làm cho nhánh đó chứa một cái gì đó sẽ gây ra lỗi.
Một throw
biểu thức được cho phép trong một hàm constexpr, miễn là nó không bao giờ được đạt tới trong các lần gọi hàm trong thời gian biên dịch (bởi vì bạn không thể ném một ngoại lệ vào thời gian biên dịch, đó là một hoạt động động vốn có, như cấp phát bộ nhớ). Vì vậy, một biểu thức ném tham chiếu đến một ký hiệu không xác định sẽ không được sử dụng trong các lệnh gọi thời gian biên dịch (vì điều đó sẽ không thể biên dịch) và không thể được sử dụng trong thời gian chạy, vì ký hiệu không xác định gây ra lỗi trình liên kết.
Bởi vì biểu tượng không xác định không được "sử dụng odr" trong các lệnh gọi thời gian biên dịch của hàm, nên trên thực tế, trình biên dịch sẽ không tạo tham chiếu đến biểu tượng, vì vậy nó không được xác định.
Điều đó có hữu ích không? Anh ấy đang trình bày cách thực hiện, không nhất thiết phải nói rằng đó là một ý tưởng hay hoặc hữu ích rộng rãi. Nếu bạn cần làm điều đó vì lý do nào đó thì kỹ thuật của anh ấy có thể giải quyết vấn đề của bạn. Nếu bạn không có nhu cầu về nó, bạn không cần phải lo lắng về nó.
Một lý do khiến nó có thể hữu ích là khi phiên bản thời gian biên dịch của một số hoạt động không hiệu quả như nó có thể. Có những hạn chế về loại biểu thức được phép trong một hàm constexpr (đặc biệt là trong C ++ 11, một số hạn chế đã được gỡ bỏ trong C ++ 14). Vì vậy, bạn có thể có hai phiên bản của một hàm để thực hiện một phép tính, một phiên bản là tối ưu, nhưng sử dụng các biểu thức không được phép trong hàm constexpr và một phiên bản là hàm constexpr hợp lệ, nhưng sẽ hoạt động kém nếu được gọi khi chạy- thời gian. Bạn có thể sử dụng phiên bản tối ưu phụ để đảm bảo nó không bao giờ được sử dụng cho các cuộc gọi thời gian chạy, đảm bảo phiên bản (không phải constexpr) hiệu quả hơn được sử dụng cho các cuộc gọi thời gian chạy.
NB Hiệu suất của một hàm constexpr được sử dụng trong thời gian biên dịch không thực sự quan trọng, vì dù sao nó cũng không có chi phí thời gian chạy. Nó có thể làm chậm quá trình biên dịch của bạn bằng cách làm cho trình biên dịch làm thêm công việc, nhưng nó sẽ không có bất kỳ chi phí hiệu suất thời gian chạy nào.