কেন libc ++ এর ভেক্টর <বুুল> :: কনস্ট্রেট রেফারেন্স বুল হয় না?


92

বিভাগ 23.3.7 শ্রেণি vector<bool>[ভেক্টর.বুল], অনুচ্ছেদ 1 এ বলা হয়েছে:

template <class Allocator> class vector<bool, Allocator> {
public:
    // types:
    typedef bool              const_reference;
    ...

তবে এই প্রোগ্রামটি libc ++ ব্যবহার করার সময় সংকলন করতে ব্যর্থ হয়:

#include <vector>
#include <type_traits>

int
main()
{
    static_assert(std::is_same<std::vector<bool>::const_reference, bool>{}, "?");
}

তবুও আমি লক্ষ করি যে সি ++ স্ট্যান্ডার্ডটি C ++ 98-তে পুরোপুরি এই নির্দিষ্টকরণের সাথে সামঞ্জস্য ছিল। এবং আমি আরও উল্লেখ করেছি যে libc ++ প্রথমত libc ++ এর প্রবর্তনের পরে এই স্পেসিফিকেশনটি ধারাবাহিকভাবে অনুসরণ করে না।

এই নিরপেক্ষতার জন্য প্রেরণা কী?

উত্তর:


99

এই সম্প্রসারণের অনুপ্রেরণা, যা একটি অনুবর্তনযোগ্য প্রোগ্রাম দ্বারা সনাক্তযোগ্য এবং এইভাবে অ-সঙ্গতিপূর্ণ নয়, তা হল রেফারেন্সের ক্ষেত্রে (কনস্ট এবং অন্যথায়) vector<bool>আচরণের মতো আচরণ করা vector<char>

ভূমিকা

1998 সাল থেকে, vector<bool>"যথেষ্ট ধারক নয়" হিসাবে উপহাস করা হচ্ছে। LWG 96 , একেবারে প্রথম এলডাব্লুজি ইস্যুগুলির মধ্যে একটি, বিতর্কটি শুরু করেছিল। আজ, 17 বছর পরে, vector<bool>মূলত অপরিবর্তিত রয়েছে।

এই কাগজটি এইভাবে জেনেরিক vector<bool>কোডকে vectorআঘাত করে, এর অন্য প্রতিটি ইনস্ট্যান্টেশন থেকে আচরণের পার্থক্য সম্পর্কে কিছু নির্দিষ্ট উদাহরণে যায় । তবে একই কাগজটি vector<bool>সঠিকভাবে প্রয়োগ করা হলে খুব সুন্দর পারফরম্যান্স বৈশিষ্ট্যগুলি দৈর্ঘ্যে আলোচনা করে ।

সংক্ষিপ্তসার : vector<bool>একটি খারাপ ধারক নয়। এটি আসলে বেশ কার্যকর। এটির একটি খারাপ নাম রয়েছে।

আবার const_reference

যেমন উপরে উপস্থাপন করা হয়েছে, এবং এখানে বিশদ হিসাবে যা খারাপ তা হ'ল vector<bool>এটি অন্যান্য vectorতাত্ক্ষণের চেয়ে জেনেরিক কোডে আলাদা আচরণ করে । এখানে একটি দৃ concrete় উদাহরণ:

#include <cassert>
#include <vector>

template <class T>
void
test(std::vector<T>& v)
{
    using const_ref = typename std::vector<T>::const_reference;
    const std::vector<T>& cv = v;
    const_ref cr = cv[0];
    assert(cr == cv[0]);
    v[0] = 1;
    assert(true == cv[0]);
    assert(cr == cv[0]);  // Fires!
}

int
main()
{
    std::vector<char> vc(1);
    test(vc);
    std::vector<bool> vb(1);
    test(vb);
}

স্ট্যান্ডার্ড স্পেসিফিকেশন বলছে যে চিহ্নিত দাবীটি // Fires!ট্রিগার করবে, তবে কেবল যখন testএকটি দিয়ে চালানো হবে vector<bool>। যখন একটি দিয়ে চালানো vector<char>(অথবা কোন vectorব্যতীত boolযখন একটি যথাযথ অ ডিফল্ট Tনির্ধারিত হয়), পরীক্ষা প্রেরণ করা হয়।

Libc ++ প্রয়োগটি vector<bool>জেনেরিক কোডে অন্যরকম আচরণ করার নেতিবাচক প্রভাবগুলি হ্রাস করতে চেয়েছিল । এটি অর্জন করতে vector<T>::const_referenceএকটি কাজ এটি হ'ল নির্দিষ্ট প্রকৃতির মতোই প্রক্সি-রেফারেন্স তৈরি করা , vector<T>::referenceআপনি এটির মাধ্যমে নির্ধারণ করতে পারবেন না except এটি হ'ল, libc ++ vector<T>::const_referenceএ মূলত বিটের vectorঅনুলিপিটির পরিবর্তে বিটের অভ্যন্তরে একটি পয়েন্টার ।

লাইবসি ++ এ উপরোক্ত testউভয় vector<char>এবং এর জন্য পাস করে vector<bool>

কি দামে?

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

এই নিরপেক্ষতার জন্য প্রেরণা কী?

জেনেরিক কোডে libc ++ ক্লায়েন্টকে আরও ভাল আচরণ করতে এবং সম্ভবত যথেষ্ট ফিল্ড টেস্টিংয়ের পরে পুরো সি ++ শিল্পের উন্নতির জন্য ভবিষ্যতের সি ++ স্ট্যান্ডার্ডকে এই এক্সটেনশনটির প্রস্তাব দিন।

এই জাতীয় প্রস্তাবনাটি একটি নতুন ধারক (উদাহরণস্বরূপ bit_vector) আকারে আসতে পারে যা আজকের মতো অনেকগুলি একই API রয়েছে vector<bool>তবে const_referenceএখানে আলোচিত কয়েকটি আপগ্রেড সহ with vector<bool>বিশেষীকরণের অবচয় (এবং শেষ অবধি) অনুসরণ করে । bitsetএছাড়াও এই বিভাগে কিছুটা আপগ্রেডিং ব্যবহার করতে পারে, যেমন অ্যাড const_referenceএবং পুনরাবৃত্তির একটি সেট।

এটি হ'ল অন্ধকারে bitsetযা হয় vector<bool>(যা নামকরণ করা উচিত bit_vector- বা যাই হোক না কেন), যেমন arrayহয় vector। আর উপমা সত্য রাখা হোক বা না হোক আমরা বলছি কর্তব্য boolহিসাবে value_typeএর vectorএবং array

সি ++ 11 এবং সি ++ 14 বৈশিষ্ট্যের একাধিক উদাহরণ রয়েছে যা libc ++ এ এক্সটেনশন হিসাবে শুরু হয়েছিল। স্ট্যান্ডার্ডগুলি এভাবেই বিকশিত হয়। প্রকৃত প্রদর্শিত ইতিবাচক ক্ষেত্র অভিজ্ঞতা শক্তিশালী প্রভাব বহন করে। বিদ্যমান স্পেসিফিকেশনগুলি (যেমন তাদের হওয়া উচিত) পরিবর্তন করার ক্ষেত্রে মানগুলি লোকগুলি একটি রক্ষণশীল গুচ্ছ হয়। অনুমান করা, এমনকি আপনি যখন নিশ্চিত হন যে আপনি সঠিকভাবে অনুমান করছেন তখনও আন্তর্জাতিকভাবে স্বীকৃত মানটি বিকশিত করার জন্য একটি ঝুঁকিপূর্ণ কৌশল।


4
প্রশ্ন: / এরিকনিবারের দ্বারা প্রক্সি পুনরাবৃত্তির উপর সাম্প্রতিক খসড়া প্রস্তাবটি কি কোনওভাবে লিবিসি ++ এক্সটেনশনগুলিকে বৈধতা দিতে এবং vector<bool>আরও প্রথম-শ্রেণীর ভিত্তি স্থাপন করতে পারে?
TemplateRex

মন্তব্য: আমি একটি আছে পছন্দ vector_bool<Alloc>এবং একটি array_bool<N>বস্তাবন্দী সংস্করণ (র্যান্ডম অ্যাক্সেস প্রক্সি সমস্ত বিট iterating iterators সহ) প্রতিনিধিত্ব করতে vector<bool, Alloc>এবং array<bool, N>। যাইহোক, bitset<N>(এবং এটি কাজিন boost::dynamic_bitset<Alloc>) একটি আলাদা বিমূর্ততা উপস্থাপন: যথা এর প্যাক সংস্করণ std::set<int>। তাই আমি, have বলছি, চাই bit_array<N>এবং bit_vector<Alloc>bitset ভোটাধিকার উত্তরাধিকারী উপযুক্ত সাথে থাকতে দ্বিমুখী iterators (বদলে সমস্ত বিট উপর 1-বিট উপর iterating)। এ ব্যাপারে আপনার চিন্তা - ভাবনা কি?
TemplateRex

4
প্রক্সি পুনরাবৃত্তকারীদের সম্পর্কে আমার খসড়া প্রস্তাবটি vector<bool>একটি স্টাডি-অনুসারে র্যান্ডম-অ্যাক্সেস ধারক তৈরি করবে। এটি vector<bool>একটি ভাল ধারণা হবে না । :-) আমি হাওয়ার্ডের সাথে একমত একে অন্য কিছু বলা উচিত ছিল।
এরিক নিবলার

4
কেন libc ++ এক্সটেনশানগুলি বেছে নেওয়ার এবং কঠোরভাবে মানিয়ে নেওয়ার আচরণ পাওয়ার উপায় নেই? (আমি কনফারেন্সটিকে ডিফল্ট হিসাবে তৈরি করার জন্যও বলছি না, কেবল পোর্টেবল কোড লিখতে সক্ষম হতে libc ++ এর এক্সটেনশানগুলি অক্ষম করার একটি উপায়)। আপনি যেমন জানেন যে অতীতে আমাকে libc ++ টিপল এক্সটেনশন দ্বারা দংশন করা হয়েছিল এবং সম্প্রতি বিটসেট :: কনট_রেফারেন্স এক্সটেনশান দ্বারা কামড়েছিল।
gnzlbg

4
@gnzlbg: libc ++ এর প্রাথমিক বিকাশের জন্য একটি সীমাবদ্ধ অর্থনৈতিক এবং সাময়িক সম্পদ উপলব্ধ ছিল। পরবর্তীকালে বাস্তবায়নটি প্রতিটি একক ব্যবহারকারীকে খুশি না করার জন্য বিনষ্ট হয়েছিল। উপলভ্য সংস্থানগুলি দেওয়া, ইঞ্জিনিয়ারিং ট্রেড অফগুলি সুখী ব্যবহারকারীর সংখ্যা সর্বাধিক করার, সামগ্রিক সি ++ সম্প্রদায়ে সর্বাধিক উপকারের চেষ্টা করা হয়েছিল। আপনার অভিজ্ঞতা সম্পর্কে দুঃখিত। আমি নোট করেছি যে আপনি যে টুপল এক্সটেনশানগুলির পূর্বে দৌড়েছিলেন তা এখনকার বর্তমান C ++ 1z ওয়ার্কিং পেপারে। এই ইস্যুতে, আপনি অজান্তে ত্যাগ করেছেন যাতে অনেকের উপকার হয়, এবং সেই সমস্ত লোকেরা আপনাকে কৃতজ্ঞতার জন্য owণী।
হাওয়ার্ড হিন্যান্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.