Kekeliruan Menghuraikan Paling Menjengkelkan: Menjelaskan Kekaburan
Dalam C 11, pemula seragam memperkenalkan kekaburan halus yang dikenali sebagai "parse paling menjengkelkan." Mari kita teliti contoh yang menunjukkan isu ini:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // What is Timer() ? And what type is dv? int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"? return 0; }</code>
Analisis:
Dalam baris pertama:
<code class="cpp">auto dv = Timer();</code>
Dalam baris kedua:
<code class="cpp">int time_keeper(Timer());</code>
Untuk membuktikannya, pertimbangkan program berikut:
<code class="cpp">#include <type_traits> struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }</code>
Program ini berjaya menyusun, mengesahkan bahawa time_keeper mengambil penunjuk kepada fungsi sebagai hujah.
Kesimpulannya, kekeliruan "parse paling menjengkelkan" berpunca daripada fakta bahawa ungkapan Timer() boleh ditafsirkan sebagai sama ada objek jenis Pemasa atau penunjuk fungsi kepada fungsi yang mengembalikan Pemasa. Tafsiran yang betul bergantung pada konteks di mana ungkapan itu digunakan.
Atas ialah kandungan terperinci Adakah \'Pemasa()\' fungsi atau objek? Memahami \'Paling Menjengkelkan Parse\' dalam C 11.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!