আমি কোনওভাবে অবাক হয়েছি যে নীচের কোডগুলি সংকলন করে এবং রান করে (vc2012 & gcc4.7.2)
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
এই কোডটি জরিমানা সংকলন করে কি সঠিক? এবং কেন এটি সঠিক? আমি কেন autoব্যক্তিগত প্রকারে ব্যবহার করতে পারি , যদিও আমি এর নামটি (প্রত্যাশার মতো) ব্যবহার করতে পারি না?
privateএমন যে কোনওভাবে সংকলক প্রয়োগ করতে সহায়তা করতে পারে এমনভাবে API গুলি বর্ণনা করার সুবিধার্থে রয়েছে। এটি Barব্যবহারকারীর দ্বারা প্রকারের অ্যাক্সেস প্রতিরোধ করার উদ্দেশ্যে নয় Foo, সুতরাং এটির Fooউদাহরণ দিয়ে ফিরে সেই অ্যাক্সেসটি সরবরাহ করতে কোনওভাবেই বাধা দেয় না Bar।
#include <iostream>। ;-)
f.Baz().iযেমন ঠিক আছে তেমন পর্যবেক্ষণ করুনstd::cout << typeid(f.Baz()).name()। শ্রেণীর বাইরের কোডটি "দেখতে" পারে এমন ধরণের ধরণটিBaz()যদি আপনি এটি ধরে রাখতে পারেন তবে আপনি এটির নাম রাখতে পারবেন না।