"ইনট মেইন () {(([[] () {}) ()); valid" কীভাবে সি ++?


271

আমি সম্প্রতি নীচের রহস্যময় কোডটি পেরিয়ে এসেছি।

int main(){(([](){})());}

এটিকে আরও পঠনযোগ্য করার জন্য এটি পুনরায় ফর্ম্যাট করুন:

int main(){
    (([](){})());   //  Um... what?!?!
}

তবে আমি কীভাবে (([](){})())বৈধ কোড তা আমার মাথা পেতে পারি না ।

  • এটি ফাংশন পয়েন্টার সিনট্যাক্সের মতো দেখাচ্ছে না।
  • এটি কোনও অপারেটর ওভারলোডিং ট্রিক হতে পারে না। কোডটি যেমন হয় তেমন সংকলন করে।

গুগল এই সমস্ত প্রতীক অনুসন্ধানে খুব একটা সহায়তা করে নি। তবে এটি ভিজ্যুয়াল স্টুডিও 2010 সংকলন করে এবং কিছুই আউটপুট করে। কোনও ত্রুটি ছিল না, এবং কোনও সতর্কতাও ছিল না। সুতরাং এটি বৈধ কোড মত দেখাচ্ছে।

আমি জাভাস্ক্রিপ্ট এবং সি ফাংশন পয়েন্টারের বাইরে এমন উদ্ভট কোনও বৈধ কোড দেখিনি ।

কেউ কীভাবে এটি বৈধ সি ++ ব্যাখ্যা করতে পারেন?



31
এটি একটি সি ++ 11

7
@ মিস্টিয়াল - এই কোডটি আপনাকে রহস্যজনক কারণ এটি অকেজো। যদি এই ল্যাম্বদা কিছু করে, আপনি এটি ফাংশন পয়েন্টারগুলির অনুরূপ সিনট্যাক্সযুক্ত (এটির সাথে নিবিড়ভাবে সম্পর্কিত) সনাক্ত করবেন।
শেচপুরিন

14
@ মিস্টিয়াল - "সি ++ এর 6 বছরের" - ল্যাম্বডাস সবেমাত্র সি ++ 11 এ যুক্ত হয়েছিল, তাই এক বছর বা তারও আগের কারও সাথে তাদের অভিজ্ঞতা নেই।
পিট বেকার

50
এখানে ইউআরএলটি বেশ মজাদার: "কীভাবে-
ইন্টি

উত্তর:


283

কোডটি মূলত একটি খালি ল্যাম্বডাকে কল করে।

আসুন শুরু থেকে শুরু করা যাক: [](){}এটি একটি খালি লাম্বদা এক্সপ্রেশন

তারপর, সি এবং সি ++ আপনি ডান বন্ধনী এক্সপ্রেশন মোড়ানো যাবে এবং তারা ঠিক একই আচরণ যেন তাদের ছাড়া লেখা তাই কি ল্যামডা প্রায় ডান বন্ধনী প্রথম যুগল করে যে। আমরা এখন আছেন ([](){})

তারপরে, ()প্রথম মোড়কের পরে পেরেনগুলি (খালি) ল্যাম্বডাকে কল করে। আমরা এখন আছি([](){})()

পুরো এক্সপ্রেশনটি আবার পেরেন্সে আবৃত হয় এবং আমরা পাই (([](){})())

অবশেষে, ;বিবৃতি শেষ হয়। আমরা পৌঁছেছি (([](){})());


† আছে কিছু সি অন্তত কোণ ক্ষেত্রে, ++, মতো T a_var; তার মাঝে একটি পার্থক্য decltype(a_var)এবংdecltype((a_var))


7
একটি ছিনতাকে মিস করলাম।
আর মার্টিনহো ফার্নান্দিস

33
@ আর.মার্টিনহো ফার্নান্দেস: এটি এখনও কারও মধ্যে আটকে ছিল, তাই আমাকে গিয়ে এটি পুনরুদ্ধার করতে হয়েছিল।
Xoo

1
আমি মামলার সঠিকভাবে উল্লেখ করার জন্য উপবিষ্ট ছিলাম যেখানে কোনও অভিব্যক্তি জুড়ে () যুক্ত করলে শব্দার্থবিজ্ঞানের পরিবর্তন ঘটে। কিন্তু তখন আমি মনে করি যে সত্যিকার অর্থে এই প্রশ্নের কোনও সম্পর্ক নেই। সুন্দর উত্তর
সে

2
প্রথম বন্ধনী বিশ্লেষণযোগ্য পার্স ডিসেমিগিগুয়েশনের ক্ষেত্রে বন্ধনীগুলিও কোনও প্রোগ্রামটির অর্থ পরিবর্তন করে: B foo(A())foo একটি ফাংশন (কেবলমাত্র পরামিতি হিসাবে কাজ করার জন্য একটি পয়েন্টার গ্রহণ করে এবং একটি খ ফিরিয়ে দেওয়া হয়) যেখানে B foo((A()))foo এ একটি B অবজেক্ট নির্মিত হয় যা নির্মাণকারীকে অনুরোধ করে থাকে একটি অবজেক্ট (যা এই ক্ষেত্রে এক অনামী অস্থায়ী)।
বিজ্ঞাপন এন

1
@ অ্যাডএন: এটি আর প্রকাশ নয়, একটি ঘোষণা but
Xeo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.