সি ++ ডাবল অ্যাড্রেস অপারেটর? (&&)


137

আমি এসটিএল উত্স কোডটি পড়ছি এবং &&অ্যাড্রেস অপারেটর কী করণীয় তা আমার কোনও ধারণা নেই । এখানে একটি কোড উদাহরণ stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

"ঠিকানা ঠিকানা" কোনও ধারণা রাখে? কেন এটিতে কেবল একজনের পরিবর্তে দুটি ঠিকানা অপারেটর রয়েছে?


2
হতে পারে এটি কোনও রেফারেন্সের ঠিকানা।
গাবে

1
@Gabe; এটি এমন একটি ঘোষণা যাতে এটি একটি রেফারেন্সের একটি রেফারেন্স তৈরি করে, যা রেফারেন্সটি নিজেই সংশোধন করা যায় না বলে কোনও মানে হয় না। ঠিকানাটি কেবলমাত্র কোডে ব্যবহার করা যেতে পারে, যখন ঘোষণার সময় নয় (এই ক্ষেত্রে যেমন একটি প্যারামিটার বা অন্যথায়)। যদিও এর আগে আর কিছু দেখেনি।
ফলস্ট্রো

5
এমনকি যদি সেখানে একটি মাত্র ছিল &, তবে এটির ঠিকানা-অপারেটরের সাথে কিছুই করার থাকবে না, পরিবর্তে এটি __xউল্লেখ করুন।
sepp2k

উত্তর:


112

এটি সি ++ 11 কোড। সি ++ 11-এ, &&টোকেনটি "মূল্যায়ন রেফারেন্স" বোঝাতে ব্যবহৃত হতে পারে।


174

&&সি ++ 11 এ নতুন। int&& a"a" অর্থ একটি আর-মান উল্লেখ। &&সাধারণত কোনও ফাংশনের প্যারামিটার ঘোষণার জন্য ব্যবহৃত হয়। এবং এটি কেবল একটি আর-মূল্য প্রকাশ করে। আপনি যদি আর-মান কী তা জানেন না, তবে সহজ ব্যাখ্যাটি হ'ল এর কোনও মেমরি ঠিকানা নেই। উদাহরণস্বরূপ 6 নম্বর, এবং অক্ষর 'ভি' উভয়ই আর-মান। int a, একটি একটি এল-মান, তবে (a+2)একটি আর-মান। উদাহরণ স্বরূপ:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

আশা করি তথ্যবহুল।


11
আপনি চাইলে কেবল উদাহরণটিই হ'ল এটি কীভাবে স্ট্যান্ড :: পদক্ষেপের সাথে কাজ করে। int&& c = std::move( b );ইত্যাদির সাথে কী ঘটবে তা দেখাচ্ছে
জজ্জাচ ...

2
দেখে মনে হচ্ছে শ্রাবনী এস এখানে 15 ফেব্রুয়ারী 2018 এ টিউটোরিয়ালপয়েন্টের জন্য আপনার কাছ থেকে নির্মমভাবে চুরি করেছিলেন ।
গ্যাব্রিয়েল স্ট্যাপলস

3
আমি এই বার্তাটি টিউটোরিয়ালপয়েন্টটি প্রেরণ করেছি । নিবন্ধটি যেমন তাদের দ্বারা চুরি করা হয়েছে তেমন দেখাচ্ছে
গ্যাব্রিয়েল স্ট্যাপলস

86

&&সি ++ 11 এ নতুন এবং এটি চিহ্নিত করে যে ফাংশনটি একটি আরভ্যালু-রেফারেন্স গ্রহণ করে - এটি, যে যুক্তিটি বিনষ্ট হতে চলেছে তার রেফারেন্স


@ ব্রোনক্ক: আপনি কি এই বার্তায় পোস্টের তারিখটি দেখেছেন? এটি ২৮ শে ডিসেম্বর, ২০১০ হিসাবে প্রকাশিত হয়নি।
বিলি ওনিল

এই সম্পর্কে দুঃখিত, এখন সরানো হয়েছে। পরের বার আরও সতর্কতা অবলম্বন করা হবে :)
ব্রোনকেক

34

অন্যান্য উত্তরের হিসাবে উল্লেখ করা হয়েছে, &&এই প্রসঙ্গে টোকেনটি সি ++ 0 এক্স (পরবর্তী সি ++ স্ট্যান্ডার্ড) এর ক্ষেত্রে নতুন এবং একটি "মূল্যের রেফারেন্স" উপস্থাপন করে।

মূল্যমানের রেফারেন্সগুলি আসন্ন স্ট্যান্ডার্ডের অন্যতম গুরুত্বপূর্ণ নতুন বিষয়; তারা বস্তুগুলিতে 'মুভ' শব্দার্থবিজ্ঞানের জন্য সমর্থন সক্ষম করে এবং ফাংশন কলগুলির নিখুঁত ফরোয়ার্ডের অনুমতি দেয়।

এটি একটি বরং জটিল বিষয় - সেরা পরিচয়ের মধ্যে একটি (এটি নিছক অভিশাপ নয়) স্টিফান টি লাভাভেজের একটি নিবন্ধ, "মূল্যায়ন রেফারেন্স: ভিসি 10-এর সি ++ 0 এক্স বৈশিষ্ট্য, পার্ট 2"

নোট করুন যে নিবন্ধটি এখনও বেশ ভারী পড়া, কিন্তু ভাল সার্থক। এবং এটি মাইক্রোসফ্ট ভিসি ++ ব্লগে থাকা সত্ত্বেও, সমস্ত (বা প্রায় সবগুলি) তথ্য যে কোনও সি ++ 0x সংকলকটির জন্য প্রযোজ্য।


&&নিজেই টোকেন নতুন নয়; ঘোষণাপত্রে এর অর্থ হ'ল। তবে আপনি তা জানতেন।
Aschepler

এ প্রসঙ্গে এটি নতুন। তবে সি / সি ++ এর পক্ষে এটির টোকেনগুলি বিভিন্ন প্রসঙ্গে ভিন্ন অর্থ পেতে ওভারলোড করা অত্যন্ত প্রথাগত।
মার্টিন ইয়র্ক 21

1
@ আস্ক্লেপার - অবশ্যই ... লজিক্যাল-এবং অপারেটর এমনকি আমার মনেও প্রবেশ করেনি। আমি উত্তর আপডেট করব।
মাইকেল বারার 21

5

আমি বিশ্বাস করি যে এটি একটি মুভ অপারেটর। operator=এসাইনমেন্ট অপারেটর, বলুন vector x = vector yclear()ফাংশন কল মত যদি এটি একটি মেমরি লিক প্রতিরোধ ভেক্টর বিষয়বস্তু মুছে ফেলার হয় শোনাচ্ছে। অপারেটর নতুন ভেক্টরটিতে একটি পয়েন্টার দেয়।

এই পথে,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

যদিও আমরা ভেক্টরকে একটি মান দিয়েছি, ভেক্টর খ এর মান রয়েছে। এটা যাদু operator=()!

এমএসডিএন - কীভাবে মুভ কনস্ট্রাক্টর তৈরি করবেন


1
4 বছরের পুরানো এই প্রশ্নটিতে আপনার উত্তরটি কী যুক্ত হবে, যা ইতিমধ্যে অন্যান্য উত্তরে ?াকা হয়নি?
মাস্কেভ ম্যান

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