আমার পূর্ববর্তী প্রশ্নের একটি আকর্ষণীয় ফলোআপ (যদিও বড় ব্যবহারিক গুরুত্বের সাথে নয়): কেন ভেরিয়েবল ঘোষণার সময় সি ++ আমাদের কেন বন্ধনীতে পরিবর্তনশীল নামটি ঘিরে রাখার অনুমতি দেয়?
আমি জানতে পেরেছি যে ইনজেকশন শ্রেণীর নাম বৈশিষ্ট্যটির সাথে বন্ধনীগুলিতে ঘোষণাকে একত্রিত করার ফলে সংকলক আচরণ সম্পর্কিত বিস্ময়কর ফলাফল হতে পারে।
নীচের প্রোগ্রামটি একবার দেখুন:
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
G ++ 4.9.2 দিয়ে সংকলন আমাকে নিম্নলিখিত সংকলন ত্রুটি দেয়:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
এটি MSVC2013 / 2015 এবং প্রিন্ট সহ সফলভাবে সংকলন করে
C (B *)
এটি ঝনঝন 3.5 এবং প্রিন্ট সহ সফলভাবে সংকলন করে
C
সুতরাং বাধ্যতামূলক প্রশ্ন কোনটি সঠিক? :)
(আমি জোরালোভাবে ঝাঁকুনির সংস্করণের দিকে ছড়িয়ে পড়েছি যদিও এবং প্রযুক্তিগতভাবে টাইপডেফের সাথে টাইপ পরিবর্তন করার পরে ভেরিয়েবলের ঘোষণা বন্ধ করার জন্য এমএসভিসি উপায়টি একেবারেই অদ্ভুত বলে মনে হয়)
C::C
কোনও ধরণের নাম এটি কোনও ফাংশনটির নাম দেয় না, তাই জিসিসি সঠিক ইমো।
C::C y;
মানে না, তাই না? উভয়েইC::C (y);
প্রথমে আমি ভেবেছিলাম এটি মোস্ট-ভেক্সিং-পার্স স্ট্যাকওভারফ্লো. com/Qtionstions/tagged/ Most-vexing-parse এর উদাহরণ , তবে এখন আমি মনে করি এটি কেবল অপরিজ্ঞাত আচরণের অর্থ তিনটি সংকলক "সঠিক"।