কেন এই সংকলন হয় আমি বুঝতে পারছি না


80

আমি অবশ্যই কিছু অনুপস্থিত, তবে আমি বুঝতে পারি না কেন এটি সংকলন করে (জি ++ এবং ঝনঝন ++ উভয়ই সহ):

struct A
{
};
struct B
{
};

int main()
{
  A a(B);
}

প্রথমত, Bএকটি প্রকার ... মান নয়। আমি এই কোডটি কীভাবে ব্যাখ্যা করব?



8
@ আলটারেজেল এটা কি সত্যি? এক্ষেত্রে কোনও অস্পষ্টতা নেই। এটি কেবলমাত্র কোনও ফাংশন ঘোষণা হতে পারে। এটি এমন নয় A a(B());যা কোনও পরিবর্তনশীল সংজ্ঞা বা ফাংশন ঘোষণা হতে পারে।
আখরোট

8
কোনও কিছুর নাম না থাকলেও আপনি সেই struct A{}; int main() { A(foo); } সংকলনগুলি জেনে অবাক হবেন foo
আয়ানসান

20
@alterigel - এই হল না সবচেয়ে অসন্তোষজনক পার্স। আপনি যে পৃষ্ঠাটিতে লিঙ্ক করেছেন তার উদাহরণগুলি দেখুন। এটি কেবল একটি ফাংশন ঘোষণা।
পিট বেকার

3
@ পেটবেকার, এটি এমভিপি নয় কেন এটি ঠিক নয়, বরং আমি বিশ্বাস করি যে আখরোট ইতিমধ্যে উপরে করেছে of
JPhi1618

উত্তর:


84

এটি নামের একটি ক্রিয়াকলাপের ঘোষণাপত্র হিসাবে ব্যাখ্যা করা হয় a, যা টাইপ Bএবং রিটার্নগুলির একটি যুক্তি নেয় A


5
এবং সে কারণেই এটি সর্বাধিক এবং Vexing। একটি সমাধান: (যেহেতু এটি খারাপ নির্মাণ A a{B};
প্রকাশের

23
@ user4581301 - এটা না সবচেয়ে অসন্তোষজনক পার্স। এটি কেবল একটি ফাংশন ঘোষণা।
পিট বেকার

23
সুতরাং দেখা যাচ্ছে এটি কেবলমাত্র বেশিরভাগ
ভেক্সিং

11
এটি সম্পর্কে সবচেয়ে অদ্ভুত অংশটি হ'ল সি ++ নেস্টেড ফাংশনগুলিকে মঞ্জুরি দেয় না তবে কোনও ফাংশনের অভ্যন্তরে ঘোষণার অনুমতি দেয়।
The_Sympathizer

6
সি ++ এ নেস্টেড ফাংশনগুলির জন্য সমর্থন যুক্ত করার জন্য একটি ভাল অনুপ্রেরণার মতো মনে হচ্ছে; কেবল তারা কার্যকর হবে না, তারা এই অদ্ভুত মশালাকে একটি যুক্তিসঙ্গত নকশায় রূপান্তরিত করবে :)
জেরেমি ফ্রাইজনার

15

এটা শুধু একটি ফাংশন ঘোষণা প্রকাশক এর aফিরে একটি ফাংশন হতে Aএবং ধরন এক নামহীন পরামিতি গ্রহণ B

এটি বৈধ কারণ ফাংশন সংজ্ঞাগুলির বিপরীতে ফাংশন ঘোষণাগুলি ফাংশন সংজ্ঞাগুলির মধ্যে অনুমোদিত।


13

এই সমস্যাটি সর্বাধিক ভেক্সিং পার্স হিসাবে পরিচিত । রেখাটি A a(B);কোনও ফাংশনের aপ্রকারের প্রত্যাশাকে ফেরত দেওয়া Aএবং নামবিহীন প্যারামিটার গ্রহণের নাম হিসাবে ব্যাখ্যা করা যেতে পারে B

এই সমস্যাটি এড়ানোর এক উপায় হ'ল ইউনিফর্ম ইনিশিয়ালাইজেশন সিনট্যাক্স ব্যবহার করা যা সি ++ 11-এ প্রবর্তিত হয়েছিল, যা বন্ধনী পরিবর্তে ব্রেস ব্যবহার করে: A a{B};একটি ত্রুটি প্রদান করে। লাইনটি এখন একটি পরিবর্তনশীল ঘোষণা হিসাবে আরম্ভ করা হিসাবে ব্যাখ্যা করা হয় B, যা একটি মানের পরিবর্তে একটি প্রকার।

এখানে আরও তথ্য:

সর্বাধিক ভেক্সিং পার্স: কীভাবে এটি স্পট করবেন এবং দ্রুত এটি ঠিক করুন


12
আমি মনে করি না এটি " মোস্ট ভেক্সিং পার্স " বলা উচিত । এটি কেবলমাত্র একটি সাধারণ ক্রিয়াকলাপের ঘোষণা হিসাবে এটি সি তেও বিদ্যমান There কোনও দ্ব্যর্থতার সমাধানের দরকার নেই কারণ লাইনটি কেবলমাত্র একটি ফাংশন ঘোষণা হতে পারে, অন্য কিছুই নয়। আপনার লিঙ্কটি দেখুন। উদাহরণগুলি এগুলি থেকে সমস্ত পৃথক।
আখরোট

3
যদিও এটি সত্য, এটি সবচেয়ে ভেক্সিং পার্সের সাথে সম্পর্কিত। এটি ঠিক যে এটিতে একটি টাইপও অন্তর্ভুক্ত ছিল যেখানে ভেরিয়েবল বা কনস্ট্রাক্টর কলের পরিবর্তে কোনও টাইপের নামই ব্যবহৃত হত, সম্ভবত এটি মূল উদ্দেশ্য ছিল।
মিরাল

1
হ্যাঁ, "মোস্ট ভেক্সিং পার্স" এই ক্ষেত্রে একটি দরকারী উত্তর, যদিও প্রশ্নের আসল কেসটি কেবল "সামান্য ভেক্সিং পার্স"।
জেপা

1
@ ওয়ালানট: খালি কাঠামোটি struct A { };স্ট্যান্ডার্ড সি তে বৈধ নয়, এমনকি কিছু সংকলক তাদের অনুমতি দেয়। বন্ধনীগুলি ফেলে দিন সেখানে কোনও সমস্যা হবে না। এছাড়াও, সিতে, ঘোষণা বা সংজ্ঞায়িত struct Aকরে কোনও প্রকারের নাম তৈরি হয় না A(আপনার অবশ্যই এটির সাথে উপসর্গ করতে হবে struct, বা উপসর্গ ব্যতীত typedef struct A A;অন্য কোথাও যুক্ত করা উচিত )। সি তেও, ফাংশন ঘোষণার বিকল্প কোনও পার্স নেই - সহজভাবে ব্যবহার করা কোনও পরিবর্তনশীল সংজ্ঞা হতে পারে না; এটি সর্বদা একটি কার্য ঘোষণা (বা অবৈধ)। প্রশ্নের কোডটি সি তে বৈধ নয়Astructtype name(...);
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.