স্থানান্তরিত বস্তুর সাথে আমি কী করতে পারি?


138

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

উদাহরণস্বরূপ, swapস্ট্যান্ডার্ড লাইব্রেরিতে সংজ্ঞায়িত হিসাবে ফাংশন টেম্পলেটটি নিন :

template <typename T>
void swap(T& a, T& b)
{
    T c = std::move(a); // line 1
    a = std::move(b);   // line 2: assignment to moved-from object!
    b = std::move(c);   // line 3: assignment to moved-from object!
}

স্পষ্টতই, সরানো-থেকে অবজেক্টগুলিতে নিয়োগ করা অবশ্যই সম্ভব, অন্যথায় 2 এবং 3 লাইন ব্যর্থ হবে। সুতরাং সরানো-থেকে অবজেক্টের সাথে আমি আর কী করতে পারি? স্ট্যান্ডার্ডে আমি এই বিশদটি কোথায় খুঁজে পাব?

(যাইহোক, এটি 1 লাইনের T c = std::move(a);পরিবর্তে কেন T c(std::move(a));?)

উত্তর:


53

সরানো-থেকে অবজেক্টগুলি একটি অনির্ধারিত, তবে বৈধ, অবস্থায় রয়েছে। এটি সুপারিশ করে যে যখন অবজেক্টটি আর বেশি কিছু করতে সক্ষম না হতে পারে, তার সদস্য সদস্যদের সমস্ত কার্যক্রমে এখনও নির্ধারিত আচরণ প্রদর্শন করা উচিত operator=- এবং - এর সমস্ত সদস্য একটি সংজ্ঞায়িত অবস্থায় থাকে- এবং এর জন্য এখনও ধ্বংসের প্রয়োজন হয়। স্ট্যান্ডার্ডটি কোনও নির্দিষ্ট সংজ্ঞা দেয় না কারণ এটি প্রতিটি ইউডিটির কাছে স্বতন্ত্র হবে তবে আপনি স্ট্যান্ডার্ড প্রকারের জন্য নির্দিষ্টকরণগুলি সন্ধান করতে সক্ষম হতে পারেন। কিছু ধারক যেমন তুলনামূলকভাবে সুস্পষ্ট - তারা কেবল তাদের বিষয়বস্তুগুলি প্রায় ঘুরিয়ে দেয় এবং খালি ধারকটি একটি সু-সংজ্ঞায়িত বৈধ রাষ্ট্র। প্রিমেটিভরা সরানো থেকে নিখরচায় পরিবর্তন করে না।

পার্শ্ব দ্রষ্টব্য: আমি বিশ্বাস করি T c = std::move(a)যে এটি মুভ কনস্ট্রাক্টর (বা কোনও স্থানান্তর সরবরাহ না করা থাকলে অনুলিপি নির্মাণকারী) ফাংশনটি ব্যর্থ হবে।


26
এর সমস্ত সদস্যের কাজগুলি সংজ্ঞায়িত আচরণ প্রদর্শন করবে না। পূর্ব শর্তাদি কেবল তাদেরই। উদাহরণস্বরূপ আপনি সম্ভবত pop_backস্থানান্তরিত হতে চান না vector। তবে আপনি অবশ্যই তা খুঁজে পেতে পারেন empty()
হাওয়ার্ড হিন্যান্ট

6
@ হওয়ার্ড হিন্যান্ট: মেমরির দিক pop_backথেকে শূন্যপদে vectorকোনওভাবেই সংজ্ঞায়িত আচরণ রয়েছে, সুতরাং আমি নিশ্চিত যে মুভিড ভেক্টর থেকে অপরিজ্ঞাত pop_backআচরণ প্রদর্শন করা সামঞ্জস্যপূর্ণ।
কুকুরছানা

12
আমরা স্থানান্তরিত বস্তুগুলি নিয়ে আলোচনা করছি। খালি অবস্থায় থাকা বস্তুগুলি নয়। সরানো-থেকে অবজেক্টগুলির একটি অনির্ধারিত অবস্থা রয়েছে (অবশ্যই অন্যথায় নির্দিষ্ট না করে) unless [lib.types.movedfrom]
হাওয়ার্ড

5
@ নিখরচায়, তবে বৈধ, তবে pop_backএখনও কোনও বৈধ ভেক্টরের মতো আচরণ করে (এটি এমনকি শূন্য ভেক্টরও হতে পারে)।
খ্রিস্টান রাউ

1
এই প্রসঙ্গে অনির্দিষ্ট ও বৈধ অর্থ কী?
অঙ্কুর এস

114

17.6.5.15 [lib.types.movedfrom]

সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে সংজ্ঞায়িত ধরণের অবজেক্টগুলি (12.8) থেকে সরানো হতে পারে। সরানো ক্রিয়াকলাপগুলি স্পষ্টভাবে নির্দিষ্ট বা স্পষ্টভাবে উত্পন্ন হতে পারে। অন্যথায় নির্দিষ্ট না করাতে এ জাতীয় স্থানান্তরিত অবজেক্টগুলি একটি বৈধ তবে অনির্ধারিত অবস্থায় স্থাপন করা হবে in

যখন কোনও অবজেক্ট অনির্ধারিত অবস্থায় থাকে তখন আপনি সেই অবজেক্টের যে কোনও অপারেশন করতে পারেন যার কোনও পূর্বশর্ত নেই। আপনি যে শর্তটি সম্পাদন করতে চান তার সাথে যদি কোনও অপারেশন হয় তবে আপনি সরাসরি সেই ক্রিয়াকলাপটি সম্পাদন করতে পারবেন না কারণ আপনি জানেন না যে বস্তুর অনির্ধারিত-অবস্থা পূর্বশর্তগুলি সন্তুষ্ট করে কিনা।

সাধারণত পূর্বশর্ত না থাকা অপারেশনগুলির উদাহরণ :

  • ধ্বংস
  • নিয়োগ
  • যেমন const পর্যবেক্ষক get, empty,size

অপারেশনগুলির উদাহরণগুলির মধ্যে সাধারণত পূর্বশর্ত থাকে:

  • ডি-রেফারেন্স
  • ফিরে পপ

এই উত্তরটি এখন ভিডিও ফর্ম্যাটে এখানে উপস্থিত হবে: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s


1
তবে আমি কেবল পূর্বের শর্তগুলি ঠিক যেমন অন্য কোনও বস্তুর সাথে পরীক্ষা করতে পারি, তাই না?
ফ্রেডওভারফ্লো

6
@ ফ্রেড ওভারফ্লো যতক্ষণ না এই চেকগুলির নিজের কোনও পূর্বশর্ত অবশ্যই থাকবে।
খ্রিস্টান রাউ

1
@ ক্রিস: তবে কীভাবে এটি একটি সাধারণ থেকে আলাদা, সরানো-অবজেক্ট থেকে নয়?
ফ্রেডওভারফ্লো

2
মে-হতে হবে একটি পৃথক প্রশ্ন হওয়া উচিত, তবে এর অর্থ কি: আমার char* buffer;এবং int length;সদস্যদের সাথে যদি আমার একটি স্ট্রিং থাকে তবে আমার মুভ কনস্ট্রাক্টর / অ্যাসাইনমেন্টটি অবশ্যই উভয়ের মান অদলবদল (বা সেট) করতে হবে? অথবা এটি কি ঠিক হবে, যদি দৈর্ঘ্যটি অনির্দিষ্ট করা হয় (যার অর্থ emptyএবং sizeঅর্থহীন মানগুলি ফেরত দেয়)?
আঙ্কেলবেন্স

3
@ 6502: আপনি বোধগম্য হবেন না। একটি সি ++ 03 শ্রেণি "সি ++ 0x মান লঙ্ঘন করছে না" কারণ উত্পন্ন যদি একটি সরানো কর্টার মানটিকে লঙ্ঘন করে। এবং সি ++ 03 কোডটি সেই শ্রেণিটিকে সরিয়ে ফেলবে না তাই কোনও মুভ সিটার তৈরি করার কোনও কারণ নেই।
এমসাল্টারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.