Apabila menggunakan templat std::function, kekaburan boleh timbul disebabkan oleh banyak beban yang munasabah. Secara khusus, pertimbangkan coretan kod berikut:
<code class="cpp">#include <functional> using namespace std; int a(const function<int()>& f) { return f(); } int a(const function<int(int)>& f) { return f(0); } int x() { return 22; } int y(int) { return 44; } int main() { a(x); // Call is ambiguous. a(y); // Call is ambiguous. }</code>
Kekaburan berpunca daripada fakta bahawa kedua-dua fungsi
Tandatangan hujah templat untuk std::function dianggap sebagai sebahagian daripada jenisnya semasa pengisytiharan dan takrifan. Walau bagaimanapun, ini tidak berlaku semasa pembinaan objek.
std::function, seperti banyak objek berfungsi dalam C , menggunakan teknik yang dipanggil pemadaman jenis. Ini membolehkannya menerima objek atau fungsi sewenang-wenangnya, selagi ia memenuhi tandatangan yang diharapkan apabila dipanggil. Kelemahannya ialah ralat yang berkaitan dengan tandatangan yang tidak sepadan berlaku jauh dalam pelaksanaan, bukannya pada peringkat pembina.
Tiga pilihan utama wujud untuk mengelakkan kekaburan ini:
Walaupun hujah templat bagi std::function menentukan jenisnya semasa pengisytiharan dan takrifan, ia tidak memainkan peranan dalam pembinaan objek. Ini boleh membawa kepada kekaburan apabila pembina menerima hujah sewenang-wenangnya. Untuk menyelesaikan masalah ini, pengaturcara boleh menggunakan penghantaran jenis eksplisit, pembalut objek fungsi atau TMP.
Atas ialah kandungan terperinci Adakah Argumen Templat `std::function` Mempengaruhi Jenisnya Semasa Pembinaan Objek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!