এটি উল্লিখিত হিসাবে কাজ করবে না, কারণ list.begin()
টাইপ আছে const T *
, এবং ধ্রুবক বস্তু থেকে আপনি সরানোর কোনও উপায় নেই। ভাষা ডিজাইনাররা সম্ভবত এটি তৈরি করেছিলেন যাতে প্রাথমিককরণের তালিকাগুলিকে উদাহরণস্বরূপ স্ট্রিং ধ্রুবকগুলির জন্য অন্তর্ভুক্ত থাকতে পারে, যেখান থেকে এটি সরানো অনুচিত।
তবে আপনি যদি এমন পরিস্থিতিতে থাকেন যে আপনি যদি জানেন যে প্রারম্ভিক তালিকার মধ্যে মূল্যের ভাব রয়েছে (বা আপনি ব্যবহারকারীকে সেগুলি লিখতে বাধ্য করতে চান) তবে একটি কৌশল আছে যা এটি কার্যকর করবে (সুমেন্টের উত্তরের দ্বারা অনুপ্রেরণা পেয়েছিলাম) এটি, তবে সমাধানটি এর চেয়ে সহজতর উপায়)। আপনি প্রয়োজন initialiser তালিকা সঞ্চিত উপাদান হতে না T
মান, কিন্তু যে encapsulate মান T&&
। তারপরেও যদি সেই মানগুলি নিজেরাই const
যোগ্য হয় তবে তারা এখনও একটি পরিবর্তনযোগ্য মূল্য পুনরুদ্ধার করতে পারে।
template<typename T>
class rref_capture
{
T* ptr;
public:
rref_capture(T&& x) : ptr(&x) {}
operator T&& () const { return std::move(*ptr); }
};
এখন initializer_list<T>
যুক্তি ঘোষণার পরিবর্তে আপনি একটি initializer_list<rref_capture<T> >
যুক্তি ঘোষণা করুন । এখানে একটি দৃ concrete় উদাহরণ রয়েছে, std::unique_ptr<int>
স্মার্ট পয়েন্টারগুলির একটি ভেক্টরকে জড়িত করে, যার জন্য কেবল পদার্থবিজ্ঞানের সংজ্ঞা দেওয়া হয় (যাতে এই বিষয়গুলি নিজেরাই আর কোনও প্রাথমিকের তালিকায় সংরক্ষণ করা যায় না); তবুও নীচের প্রারম্ভক তালিকাটি সমস্যা ছাড়াই সংকলন করে।
#include <memory>
#include <initializer_list>
class uptr_vec
{
typedef std::unique_ptr<int> uptr;
std::vector<uptr> data;
public:
uptr_vec(uptr_vec&& v) : data(std::move(v.data)) {}
uptr_vec(std::initializer_list<rref_capture<uptr> > l)
: data(l.begin(),l.end())
{}
uptr_vec& operator=(const uptr_vec&) = delete;
int operator[] (size_t index) const { return *data[index]; }
};
int main()
{
std::unique_ptr<int> a(new int(3)), b(new int(1)),c(new int(4));
uptr_vec v { std::move(a), std::move(b), std::move(c) };
std::cout << v[0] << "," << v[1] << "," << v[2] << std::endl;
}
একটি প্রশ্নের উত্তরের দরকার আছে: যদি প্রাথমিকের তালিকার উপাদানগুলি সত্য মূল্য থাকে (উদাহরণস্বরূপ তারা xvalue হয়) তবে ভাষাটি কি নিশ্চিত করে যে সংশ্লিষ্ট টেম্পোরারিগুলির আজীবন তারা যে বিন্দুতে ব্যবহৃত হয়েছে সেখানে প্রসারিত হবে? সত্যই, আমি মনে করি না যে প্রমিতের 8.5 প্রাসঙ্গিক বিষয়টি এই বিষয়টিকে মোটেই সম্বোধন করে। যাইহোক, ১.৯: ১০ পড়লে মনে হবে প্রাসঙ্গিক পূর্ণ-এক্সপ্রেশনটি সব ক্ষেত্রেই ইনিশিয়ালার তালিকার ব্যবহারকে অন্তর্ভুক্ত করে, সুতরাং আমি মনে করি যে মূল্যবোধের রেফারেন্সগুলি ঝুঁকির কোনও আশঙ্কা নেই।
initializer_list<T>
দ্বারা নির্ধারিত হয়েছে নন- কনস্টাস্ট। পছন্দ, অবজেক্টinitializer_list<int>
বোঝায়int
। তবে আমি মনে করি এটি একটি ত্রুটি - এটি উদ্দেশ্যযুক্ত যে সংকলকরা কেবলমাত্র পঠন মেমরির মধ্যে একটি তালিকা স্থিতিশীলভাবে বরাদ্দ করতে পারে।