আমি এটি বুঝতে পারি না:
int main() {
int (*) (int *) = 5;
return 0;
}
উপরের অ্যাসাইনমেন্টটি g ++ c ++ 11 দিয়ে সংকলন করে। আমি জানি যে int (*) (int *)
এটি একটি ফাংশনের পয়েন্টার যা একটি (int *)
আর্গুমেন্ট হিসাবে গ্রহণ করে এবং কোন পূর্বাবস্থায় ফিরে আসে, তবে আমি বুঝতে পারি না আপনি কীভাবে এটি 5 এর সমতুল্য করতে পারেন আমি প্রথমে ভেবেছিলাম এটি এমন একটি ফাংশন যা ক্রমাগতভাবে 5 ফিরিয়ে দেয় (আমার সাম্প্রতিক শিক্ষায় F #, সম্ভবত, হাহা), তারপরে আমি সংক্ষেপে ভেবেছিলাম যে ফাংশন পয়েন্টারটি মেমরির অবস্থান 5 এর দিকে নির্দেশ করে, তবে এটি কার্যকরভাবে পরিষ্কারভাবে কাজ করে না এবং হেক্সেরও মূল্যবোধ হয় না।
এটি এই কারণ হতে পারে যে ভেবেছিল যে ফাংশনটি কোনও পূর্বাবস্থায় ফিরে আসে, এবং কোনও পূর্বনির্ধারিত কাজটি ঠিক আছে (কোনওভাবে), আমি এটিও চেষ্টা করেছি:
int * (*) (int *) = my_ptr
যেখানে my_ptr
টাইপ হয় int *
, টাইপ ইন্টের সাথে প্রথম ক্ষেত্রে যেমন দ্বিতীয় ফাংশন পয়েন্টার হিসাবে একই प्रकार। এটি সংকলন করে না। 5 এর পরিবর্তে, বা কোনও অন্তর্গত মান নির্ধারণের পরে, my_ptr
এই ফাংশন পয়েন্টারের জন্য সংকলন করা হয় না।
সুতরাং অ্যাসাইনমেন্ট মানে কি?
আপডেট 1
আমাদের কাছে নিশ্চিত হয়ে গেছে যে এটি একটি বাগ, সেরা উত্তরে দেখানো হয়েছে। যাইহোক, এটা এখনও জানা যায়নি আসলে এরকম মান যে আপনি ফাংশন পয়েন্টার নির্ধারিত, বা কি নিয়োগ দিয়ে ঘটে। সে সম্পর্কে যে কোনও (ভাল) ব্যাখ্যা খুব প্রশংসা হবে! সমস্যার আরও স্পষ্টতার জন্য দয়া করে নীচের সম্পাদনাগুলি দেখুন।
সম্পাদনা করুন 1
আমি জিসিসি সংস্করণ ব্যবহার করছি 4.8.2 (উবুন্টু 4.8.2 এ)
সম্পাদনা 2
প্রকৃতপক্ষে, এটিকে কোনও কিছুর সাথে সমান করা আমার সংকলকটিতে কাজ করে। এমনকি এটি একটি std :: স্ট্রিং ভেরিয়েবল, বা একটি ফাংশন নামের যা একটি দ্বিগুণ ফিরিয়ে দেয়, সমান করে।
সম্পাদনা 2.1
মজার বিষয় হচ্ছে, এটিকে কোনও ফাংশনটির জন্য একটি ফাংশন পয়েন্টার তৈরি করে যা কোনও ডাটা টাইপ দেয় যা কোনও পয়েন্টার নয়, এটি সংকলন করতে দেয়, যেমন
std::string (*) () = 5.6;
তবে ফাংশন পয়েন্টারটি কোনও ফাংশনটিতে ফিরে আসে যা কিছু পয়েন্টার দেয়, এটি সংকলন করে না, যেমন এর সাথে
some_data_type ** (*) () = any_value;