নন-কনস্ট্যান্ট ব্যক্তিগত যখন কেন একটি সরকারী কনস্ট পদ্ধতি বলা হয় না?


117

এই কোডটি বিবেচনা করুন:

struct A
{
    void foo() const
    {
        std::cout << "const" << std::endl;
    }

    private:

        void foo()
        {
            std::cout << "non - const" << std::endl;
        }
};

int main()
{
    A a;
    a.foo();
}

সংকলক ত্রুটিটি হ'ল:

ত্রুটি: 'অকার্যকর এ :: ফু ()' ব্যক্তিগত `

তবে আমি যখন ব্যক্তিগতটি মুছি তখন এটি কার্যকর হয়। নন-কনস্ট্যান্টটি ব্যক্তিগত হলে কেন সরকারী কনস্ট পদ্ধতিটি ডাকা হয় না?

অন্য কথায়, অ্যাক্সেস নিয়ন্ত্রণের আগে কেন ওভারলোড রেজোলিউশন আসে? এটা অদ্ভুত. আপনি কি মনে করেন এটি সামঞ্জস্যপূর্ণ? আমার কোডটি কাজ করে এবং তারপরে আমি একটি পদ্ধতি যুক্ত করি এবং আমার ওয়ার্কিং কোডটি মোটেই সংকলন করে না।


3
সি ++ তে, পিআইএমপিএল আইডিয়ম ব্যবহারের মতো অতিরিক্ত প্রচেষ্টা ছাড়াই, শ্রেণীর আসল কোনও "ব্যক্তিগত" অংশ নেই। এটি কেবলমাত্র একটি সমস্যা (একটি "ব্যক্তিগত" পদ্ধতির ওভারলোড যুক্ত করা এবং সংকলন পুরাতন কোডটি ভাঙ্গা আমার বইয়ে একটি সমস্যা হিসাবে গণ্য করা হয়েছে, এমনকি যদি এটি কেবল এটি না করে এড়াতে তুচ্ছ হয়) এটি দ্বারা সৃষ্ট।
জলদি

এমন কোনও বাস্তবজীবনের কোড রয়েছে যেখানে আপনি কোনও কনস্ট্যান্ড ফাংশন কল করতে সক্ষম হবেন বলে আশা করছেন তবে এর নন-কনস্ট্যান্ট অংশটি ব্যক্তিগত ইন্টারফেসের অংশ হবে? এটি আমার কাছে খারাপ ইন্টারফেস ডিজাইনের মতো শোনাচ্ছে।
ভিনসেন্ট ফোরমন্ড

উত্তর:


125

আপনি যখন কল করবেন তখন a.foo();কম্পাইলারটি ওভারলোড রেজোলিউশনটি ব্যবহার করার জন্য সেরা ফাংশনটি সন্ধান করে। এটি যখন ওভারলোড সেট তৈরি করে এটি সন্ধান করে

void foo() const

এবং

void foo()

এখন, যেহেতু aনয় const, অ-কনস্ট্যান্ট সংস্করণটি সেরা ম্যাচ, তাই সংকলকটি চয়ন করে void foo()। তারপরে অ্যাক্সেস বিধিনিষেধগুলি স্থানে রাখা হয় এবং আপনি void foo()বেসরকারী হওয়ায় আপনি একটি সংকলক ত্রুটি পান ।

মনে রাখবেন, ওভারলোড রেজোলিউশনে এটি 'সেরা ব্যবহারযোগ্য ফাংশনটি খুঁজে পান না'। এটি 'সেরা ফাংশনটি সন্ধান করুন এবং এটি ব্যবহারের চেষ্টা করুন'। যদি এটি অ্যাক্সেস বিধিনিষেধের কারণে বা মোছার কারণে না পারেন, তবে আপনি একটি সংকলক ত্রুটি পান।

অন্য কথায় অ্যাক্সেস নিয়ন্ত্রণের আগে কেন ওভারলোড রেজোলিউশন আসে?

ঠিক আছে, আসুন দেখুন:

struct Base
{
    void foo() { std::cout << "Base\n"; }
};

struct Derived : Base
{
    void foo() { std::cout << "Derived\n"; }
};

struct Foo
{
    void foo(Base * b) { b->foo(); }
private:
    void foo(Derived * d) { d->foo(); }
};

int main()
{
    Derived d;
    Foo f;
    f.foo(&d);
}

এখন বলা যাক যে আমি আসলে void foo(Derived * d)ব্যক্তিগত করা চাইনি । যদি অ্যাক্সেস কন্ট্রোলটি প্রথম আসে তবে এই প্রোগ্রামটি সংকলন করে চলবে এবং Baseমুদ্রিত হবে। বৃহত্তর কোড বেসে ট্র্যাক করা খুব কঠিন হতে পারে। ওভারলোড রেজোলিউশনের পরে অ্যাক্সেস কন্ট্রোল আসার পরে আমি কল করতে চাই না এমন ফাংশনটি আমাকে বলার জন্য একটি দুর্দান্ত সংকলক ত্রুটি পেয়েছি এবং আমি বাগটি আরও সহজ খুঁজে পেতে পারি।


ওভারলোড রেজোলিউশনের পরে অ্যাক্সেস নিয়ন্ত্রণ হওয়ার কোনও কারণ আছে কি?
drake7707

3
@ drake7707 আপনি আমার কোডের নমুনায় দেখায় যেহেতু আপনি যদি অ্যাক্সেস কন্ট্রোলটি প্রথম আসে তবে উপরের কোডটি সংকলন করবে, যা প্রোগ্রামটির শব্দার্থবিজ্ঞানের পরিবর্তন করে। আপনার সম্পর্কে নিশ্চিত নয় তবে আমার পরিবর্তে একটি ত্রুটি আছে এবং আমি স্পষ্ট কাস্টটি করা দরকার যদি আমি ফাংশনটি ব্যক্তিগত রাখতে চাইতাম তবে একটি অন্তর্নিহিত কাস্ট এবং কোডটি নিঃশব্দে "কাজ করে"।
নাথানঅলিভার

"এবং আমি যদি ফাংশনটি ব্যক্তিগত রাখতে চাইতাম তবে একটি স্পষ্ট কাস্ট করতে হবে" - এটি এখানে আসল সমস্যা বলে মনে হচ্ছে অন্তর্নিহিত কাস্তে ... যদিও অন্যদিকে, আপনি যে উদ্ভূত শ্রেণিকেও স্পষ্টভাবে ব্যবহার করতে পারেন এই ধারণাটি বেস ক্লাস ওও দৃষ্টান্তের একটি নির্ধারিত বৈশিষ্ট্য, তাই না?
স্টিভেন বাইকস

35

পরিশেষে এটি স্ট্যান্ডার্ডের দৃ the়তার প্রতি দৃ .়ভাবে অবতীর্ণ হয় যে ওভারলোড রেজোলিউশন সম্পাদন করার সময় অ্যাক্সেসযোগ্যতার বিষয়টি বিবেচনা করা উচিত নয় । এই দাবিটি [ওভার.ম্যাচ] ধারা 3 তে পাওয়া যেতে পারে :

... যখন ওভারলোড রেজোলিউশন সফল হয় এবং সর্বোত্তম ব্যবহারযোগ্য ফাংশনটি যে প্রসঙ্গে ব্যবহৃত হয় সেই প্রসঙ্গে (ক্লজ [ক্লাস.অ্যাক্সেস]) অ্যাক্সেসযোগ্য হয় না, প্রোগ্রামটি দুর্গঠিত।

এবং একই বিভাগের 1 অনুচ্ছেদে নোট :

[দ্রষ্টব্য: ওভারলোড রেজোলিউশন দ্বারা নির্বাচিত ফাংশনটি প্রসঙ্গে উপযুক্ত হওয়ার গ্যারান্টিযুক্ত নয়। ফাংশনটির অ্যাক্সেসযোগ্যতার মতো অন্যান্য বিধিনিষেধ কলিং কনটেক্সটে এর ব্যবহারকে দুর্গঠিত করতে পারে। - শেষ নোট]

কারণ হিসাবে, আমি কয়েকটা সম্ভাব্য অনুপ্রেরণার কথা ভাবতে পারি:

  1. এটি একটি ওভারলোড প্রার্থীর অ্যাক্সেসযোগ্যতা পরিবর্তনের ফলে আচরণের অপ্রত্যাশিত পরিবর্তনগুলি প্রতিরোধ করে (পরিবর্তে, একটি সংকলন ত্রুটি ঘটবে)।
  2. এটি ওভারলোড রেজোলিউশন প্রক্রিয়া থেকে প্রসঙ্গ-নির্ভরতা সরিয়ে দেয় (অর্থাত্ ওভারলোড রেজোলিউশনটি ক্লাসের ভিতরে বা বাইরের বাইরে একই ফলাফল হবে)।

32

মনে করুন অ্যাক্সেস নিয়ন্ত্রণ ওভারলোড রেজোলিউশনের আগে এসেছিল। কার্যকরভাবে, এর অর্থ হবে public/protected/privateঅ্যাক্সেসযোগ্যতার চেয়ে নিয়ন্ত্রণযুক্ত দৃশ্যমানতা।

স্ট্রস্ট্রপ দ্বারা সি ++ এর ডিজাইন এবং বিবর্তনের বিভাগের 2.10 এর একটি অংশ রয়েছে যেখানে তিনি নিম্নলিখিত উদাহরণটি আলোচনা করেছেন

int a; // global a

class X {
private:
    int a; // member X::a
};

class XX : public X {
    void f() { a = 1; } // which a?
};

স্ট্রোভস্ট্রুপের উল্লেখ বর্তমান নিয়ম (অভিগম্যতা আগে দৃশ্যমানতা) এর সুবিধা যে (অস্থায়ীভাবে) chaning যে privateভিতরে class Xপ্রবেশ public(যেমন ডিবাগ উদ্দেশ্যে) উপরের প্রোগ্রামের অর্থ কোন শান্ত পরিবর্তন নেই (অর্থাত হয় X::aপ্রয়াস করা হয় উভয় ক্ষেত্রে অ্যাক্সেস করা হবে, যা উপরের উদাহরণে অ্যাক্সেস ত্রুটি দেয়)। যদি public/protected/privateদৃশ্যমানতা নিয়ন্ত্রণ করা হয় তবে প্রোগ্রামটির অর্থ পরিবর্তন হবে ( অন্যথায় বিশ্বব্যাপী aডাকা হবে )।privateX::a

তারপরে তিনি বলেছিলেন যে এটি স্পষ্টত নকশায় বা স্ট্যান্ডার্ড সি ++ এর ক্লাসেস পূর্বসূরীর সাথে সি বাস্তবায়নের জন্য ব্যবহৃত প্রিপ্রসেসর প্রযুক্তির কোনও পার্শ্ব প্রতিক্রিয়া দ্বারা তা স্মরণে নেই।

এটি কীভাবে আপনার উদাহরণের সাথে সম্পর্কিত? মূলত কারণ স্ট্যান্ডার্ড তৈরি ওভারলোড রেজোলিউশনটি সাধারণ নিয়মের সাথে সামঞ্জস্য করে যে নাম অনুসন্ধানটি অ্যাক্সেস নিয়ন্ত্রণের আগে আসে।

১০.২ সদস্যের নাম অনুসন্ধান [শ্রেণি.মায়ার.লুকআপ]

1 সদস্যের নাম অনুসন্ধান শ্রেণীর ক্ষেত্রের কোনও নামের অর্থ (আইডি-এক্সপ্রেশন) নির্ধারণ করে (3.3.7)। নাম অনুসন্ধানের ফলে একটি অস্পষ্টতা দেখা দিতে পারে, সেক্ষেত্রে প্রোগ্রামটি দুর্বল। একটি আইডি-এক্সপ্রেশন জন্য, নাম সন্ধান শুরু হয় এর শ্রেণিকক্ষে; একটি যোগ্য-আইডির জন্য, নাম সন্ধান শুরু করা নেস্টেডনাম-স্পেসিফায়ারের সুযোগে। অ্যাক্সেস নিয়ন্ত্রণের আগে নাম সন্ধান করা হয় (3.4, ধারা 11)।

8 যদি কোনও ওভারলোডেড ফাংশনটির নামটি দ্ব্যর্থহীনভাবে পাওয়া যায়, অ্যাক্সেস নিয়ন্ত্রণের আগে ওভারলোডিং রেজোলিউশন (13.3) হয় । অস্পষ্টতা প্রায়শই কোনও নামটির শ্রেণীর নাম সহ যোগ্যতার মাধ্যমে সমাধান করা যায়।


23

যেহেতু অন্তর্নিহিত thisপয়েন্টারটি অ-নয় const, কম্পাইলার প্রথমে constকোনও constসংস্করণের আগে ফাংশনের অ- সংস্করণের উপস্থিতি পরীক্ষা করবে ।

আপনি স্পষ্টভাবে অ- চিহ্নিত তাহলে constএক privateতারপর রেজল্যুশন ব্যর্থ হবে, এবং কম্পাইলার অনুসন্ধানের অবিরত করা হবে না।


আপনি কি মনে করেন এটি সামঞ্জস্যপূর্ণ? আমার কোডটি কাজ করে এবং তারপরে আমি একটি পদ্ধতি যুক্ত করি এবং আমার ওয়ার্কিং কোডটি মোটেই সংকলন করে না।
নেরেক

আমি তাই মনে করি। ওভারলোড রেজোলিউশন ইচ্ছাকৃত উদ্ভট। আমি গতকাল একই ধরণের প্রশ্নের উত্তর দিয়েছি: স্ট্যাকওভারফ্লো.com
বাথশেবা

5
@ নেরেক আমি বিশ্বাস করি যে এটি ওভারলোড রেজোলিউশনে মুছে ফাংশনগুলি কীভাবে কাজ করে ঠিক তেমনই কাজ করে। এটি সেট থেকে সেরাটিকে বেছে নেয় এবং তারপরে এটি দেখায় যে এটি উপলব্ধ নেই তাই আপনি একটি সংকলক ত্রুটি পান। এটি সেরা ব্যবহারযোগ্য ফাংশনটি বেছে না নেয় তবে সেরা ফাংশনটি ব্যবহার করে এবং তারপরে এটি ব্যবহারের চেষ্টা করে।
নাথানঅলিভার

3
@ নরেক আমি প্রথমও ভাবলাম কেন এটি কাজ করে না, তবে এইটি বিবেচনা করুন: যদি সরকারী কনস্ট্যান্টকেও নন কনস্টেন্টের জন্য বেছে নেওয়া হয় তবে আপনি কীভাবে ব্যক্তিগত অনুষ্ঠানটিকে কল করবেন?
idclev 463035818

20

ঘটে যাওয়া জিনিসগুলির ক্রমটি মাথায় রাখা গুরুত্বপূর্ণ:

  1. সমস্ত কার্যক্ষম ফাংশন সন্ধান করুন।
  2. সেরা व्यवहार्य ফাংশন চয়ন করুন।
  3. যদি একমাত্র কার্যকর কার্যকর না হয়, বা আপনি যদি সর্বোত্তম কার্যকর কার্যকারিতাটি কল করতে না পারেন (অ্যাক্সেস লঙ্ঘনের কারণে বা ফাংশন deleteডি হওয়ার কারণে ) ব্যর্থ হন।

(3) পরে ঘটে (2)। যা সত্যই গুরুত্বপূর্ণ, কারণ অন্যথায় ফাংশন তৈরি করা deleted বা privateবাছাই করা অর্থহীন এবং যুক্তিযুক্ত হতে আরও শক্ত।

এক্ষেত্রে:

  1. টেকসই ফাংশনগুলি হয় A::foo()এবং A::foo() const
  2. সর্বোত্তম কার্যকর কার্যকারিতা হ'ল A::foo()পরেরটির মধ্যে অন্তর্নিহিত thisযুক্তির উপর যোগ্যতার রূপান্তর জড়িত ।
  3. তবে A::foo()তা হ'ল privateএবং এতে আপনার অ্যাক্সেস নেই hence সুতরাং কোডটি দুর্বল।

1
কেউ ভাবতে পারেন যে "কার্যকর" এ প্রাসঙ্গিক অ্যাক্সেস বিধিনিষেধকে অন্তর্ভুক্ত করবে। অন্য কথায় শ্রেণীর বাইরে থেকে কোনও ব্যক্তিগত ফাংশন কল করা "কার্যকর" নয়, কারণ এটি শ্রেণীর পাবলিক ইন্টারফেসের অংশ নয়।
আরএম

15

এটি সি ++ এ মোটামুটি বেসিক ডিজাইনের সিদ্ধান্তে নেমে আসে।

কোনও কলকে সন্তুষ্ট করার জন্য ফাংশনটি সন্ধান করার সময়, সংকলকটি এই জাতীয় অনুসন্ধান চালায়:

  1. এটি প্রথম 1 টি স্কোপ সন্ধান করে যেখানে সেই নামের সাথে কিছু আছে ।

  2. কম্পাইলার খুঁজে বের করে সব যে সুযোগ এই নামের ফাংশন (অথবা functors, ইত্যাদি)।

  3. তারপরে সংকলকটি খুঁজে পাওয়া লোকদের মধ্যে সেরা প্রার্থী খুঁজে পাওয়ার জন্য ওভারলোড রেজোলিউশন করে (তারা অ্যাক্সেসযোগ্য হোক না কেন)।

  4. অবশেষে, সংকলকটি সেই নির্বাচিত ফাংশনটি অ্যাক্সেসযোগ্য কিনা তা পরীক্ষা করে।

এই আদেশের কারণে, হ্যাঁ, এটি সম্ভব যে সংকলকটি অ্যাক্সেসযোগ্য এমন একটি ওভারলোড চয়ন করবে যা অ্যাক্সেসযোগ্য (যদিও ওভারলোড রেজোলিউশনের সময় চয়ন করা হয়নি) chosen

জিনিসগুলি ভিন্নভাবে করা সম্ভব হবে কিনা তা নিয়ে : হ্যাঁ, এটি নিঃসন্দেহে সম্ভব। এটি অবশ্যই সি ++ এর চেয়ে বেশ আলাদা ভাষার দিকে নিয়ে যাবে। এটি দেখা যাচ্ছে যে আপাতদৃষ্টিতে বরং ছোটখাট সিদ্ধান্তগুলির মধ্যে অনেকগুলি র্যামফিকেশন থাকতে পারে যা প্রাথমিকভাবে সুস্পষ্ট হওয়ার চেয়ে অনেক বেশি প্রভাবিত করে।


  1. "প্রথম" নিজে থেকেই কিছুটা জটিল হতে পারে, বিশেষত যখন / যদি টেমপ্লেটগুলি জড়িত থাকে, যেহেতু তারা দ্বি-পর্বের অনুসন্ধান করতে পারে, যার অর্থ অনুসন্ধান করার সময় দুটি পৃথক পৃথক "শিকড়" রয়েছে। যদিও প্রাথমিক ধারণাটি বেশ সহজ: ক্ষুদ্রতম ঘেরের স্কোপ থেকে শুরু করুন এবং আপনার বাহিরের দিকে আরও বড় এবং বৃহত্তর এনকোলেজিং স্কোপগুলিতে কাজ করুন।

1
স্ট্রাস্ট্রপটি ডি অ্যান্ড ই তে অনুমান করে যে নিয়মটি সিতে ক্লাস সহ প্রিপ্রোসেসর ব্যবহৃত একটি পার্শ্ব প্রতিক্রিয়া হতে পারে যা আরও একবার উন্নত সংকলক প্রযুক্তিটি উপলব্ধ হয়ে ওঠার পরে কখনও পর্যালোচনা করা হয়নি। আমার উত্তর দেখুন
TemplateRex

12

অ্যাক্সেস নিয়ন্ত্রণ ( public, protected, private) জমিদার রেজল্যুশন প্রভাবিত করে না। সংকলকটি চয়ন করে void foo()কারণ এটি সেরা ম্যাচ। এটি অ্যাক্সেসযোগ্য নয় এই সত্যটি এটি পরিবর্তন করে না। এটি অপসারণ কেবলমাত্র ছেড়ে যায় void foo() const, যা তখন সেরা (অর্থাত্‍ কেবলমাত্র) ম্যাচ।


11

এই কলটিতে:

a.foo();

thisপ্রতিটি সদস্যের কার্যক্রমে সর্বদা একটি অন্তর্নিহিত পয়েন্টার পাওয়া যায়। এবং constযোগ্যতা thisকলিং রেফারেন্স / অবজেক্ট থেকে নেওয়া হয়। উপরোক্ত কলটি সংকলক দ্বারা হিসাবে বিবেচনা করা হয়:

A::foo(a);

তবে আপনার দুটি ঘোষণা রয়েছে A::fooযার মধ্যে এইরকম আচরণ করা হবে :

A::foo(A* );
A::foo(A const* );

ওভারলোড রেজোলিউশনের মাধ্যমে, প্রথমটি নন-কনস্টের জন্য this, দ্বিতীয়টি একটি এর জন্য নির্বাচিত হবে const this। আপনি যদি প্রথমটি সরিয়ে থাকেন তবে দ্বিতীয়টি উভয়কে আবদ্ধ করবে constএবংnon-const this

ওভারলোড রেজোলিউশনের পরে সর্বোত্তম কার্যক্ষম ফাংশনটি নির্বাচন করার পরে অ্যাক্সেস নিয়ন্ত্রণ আসে। আপনি যেহেতু নির্বাচিত ওভারলোডের অ্যাক্সেস নির্দিষ্ট করেছেনprivate তাই সংকলকটি তখন অভিযোগ করবে।

মানটি তাই বলে:

[class.access / 4] : ... অতিরিক্ত লোড ফাংশন নামগুলির ক্ষেত্রে, ওভারলোড রেজোলিউশন দ্বারা নির্বাচিত ফাংশনে অ্যাক্সেস নিয়ন্ত্রণ প্রয়োগ করা হয় ....

তবে আপনি যদি এটি করেন:

A a;
const A& ac = a;
ac.foo();

তারপরে, কেবল constওভারলোড ফিট হবে।


এটি স্ট্র্যাং যা ওভারলোডের রেজোলিউশনের পরে সর্বোত্তম ব্যবহারযোগ্য ফাংশনটি নির্বাচন করতে আসে অ্যাক্সেস নিয়ন্ত্রণ । অ্যাক্সেস নিয়ন্ত্রণ ওভারলোড রেজোলিউশনের আগে এমন হওয়া উচিত যেমন আপনার অ্যাক্সেস না থাকা উচিত আপনার এটিকে বিবেচনা করা উচিত নয়, আপনি কী মনে করেন?
নরেক

@ নরেক, .. আমি আমার উত্তরটি সি ++ মানের উল্লেখের সাথে আপডেট করেছি । এটি প্রকৃতপক্ষে
সেটিকে বোঝায়

9

প্রযুক্তিগত কারণ অন্যান্য উত্তর দ্বারা উত্তর দেওয়া হয়েছে। আমি কেবল এই প্রশ্নের উপর মনোনিবেশ করব:

অন্য কথায় অ্যাক্সেস নিয়ন্ত্রণের আগে কেন ওভারলোড রেজোলিউশন আসে? এটা অদ্ভুত. আপনি কি মনে করেন এটি সামঞ্জস্যপূর্ণ? আমার কোডটি কাজ করে এবং তারপরে আমি একটি পদ্ধতি যুক্ত করি এবং আমার ওয়ার্কিং কোডটি মোটেই সংকলন করে না।

ভাষাটি এইভাবে ডিজাইন করা হয়েছিল। অভিপ্রায়টি যথাসম্ভব সর্বোত্তম কার্যকর ওভারলোডকে কল করার চেষ্টা করছে। যদি এটি ব্যর্থ হয়, আপনাকে আবার ডিজাইনটি বিবেচনা করার জন্য মনে করিয়ে দেওয়ার জন্য একটি ত্রুটি ট্রিগার করা হবে।

অন্যদিকে, ধরুন আপনার কোডটি সংকলিত হয়েছে এবং constসদস্য ফাংশনটি চাওয়ার সাথে সাথে ভাল কাজ করেছে । একদিন, কেউ (হয়তো নিজেকে) তাহলে অ অভিগম্যতা পরিবর্তন করার সিদ্ধান্ত নেয় constথেকে সদস্য ফাংশন privateথেকে public। তারপরে, কোনও সংকলন ত্রুটি ছাড়াই আচরণটি পরিবর্তিত হবে! এটি একটি অবাক করা হবে



8

অ্যাক্সেস স্পেসিফায়াররা কখনও নাম-দর্শন এবং ফাংশন-কল রেজোলিউশনকে প্রভাবিত করে না। কম্পাইলারটি কলটি কোনও অ্যাক্সেস লঙ্ঘন ঘটিয়েছে কিনা তা পরীক্ষা করার আগে ফাংশনটি নির্বাচিত হয়।

এইভাবে, আপনি যদি কোনও অ্যাক্সেস স্পেসিফায়ার পরিবর্তন করেন তবে বিদ্যমান কোডে লঙ্ঘন হলে সংকলন-সময় আপনাকে সতর্ক করা হবে; যদি ফাংশন কল রেজোলিউশনের জন্য গোপনীয়তা বিবেচনায় নেওয়া হয়, তবে আপনার প্রোগ্রামটির আচরণ নীরবে পরিবর্তন হতে পারে।

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