Std :: ভেক্টর রেঞ্জ কনস্ট্রাক্টর সুস্পষ্ট রূপান্তর প্রার্থনা করতে পারে?


14

নিম্নলিখিত প্রোগ্রামটি কি সুগঠিত?

#include <vector>
struct A {
    explicit A(int) {}
};
int main() {
    std::vector<int> vi = {1, 2, 3, 4, 5};
    std::vector<A> va(vi.begin(), vi.end());
}

সি ++ 17 অনুসারে [সিকোয়েন্স.আরকিমিটস], এর জন্য প্রয়োজনীয়

X u(i, j);

Xসিকোয়েন্স কনটেইনারটি কোথায় , তা হ'ল:

Tথেকে হতে EmplaceConstructibleহবে ।X*i

তবে পূর্ববর্তী অনুচ্ছেদে বলা হয়েছে যে:

iএবং jপুনরাবৃত্তকারীদের ইনপুট পুনরাবৃত্তির প্রয়োজনীয়তাগুলি সন্তুষ্ট করে বোঝায় এবং এগুলিকে স্পষ্টত রূপান্তরিত করতে পারেন value_type,

সুতরাং এটি আমার কাছে মনে হয় যে উভয় প্রয়োজনীয়তা মেটানো দরকার: পরিসরের মানের ধরণটি ধারকটির মান ধরণের ক্ষেত্রে স্পষ্টত রূপান্তরিত হতে হবে এবং EmplaceConstructible সন্তুষ্ট থাকতে হবে (যার অর্থ বরাদ্দকারী অবশ্যই প্রয়োজনীয় সূচনা করতে সক্ষম হবে) । যেহেতু intসুস্পষ্টভাবে রূপান্তরযোগ্য নয় A, তাই এই প্রোগ্রামটি গঠনমূলক হওয়া উচিত।

তবে আশ্চর্যের বিষয়, এটি জিসিসির অধীনে সংকলিত বলে মনে হচ্ছে


(রেকর্ডের জন্য, এটি কেবল জিসিসি নয়: গডবোল্ট.আর্গ / জেড / এলআরডিডাব্লু )
ম্যাক্স

এই ক্ষেত্রে কোনও অন্তর্নিহিত রূপান্তর প্রয়োজন হবে না, কারণ সুস্পষ্ট নির্মাতা ইতিমধ্যে টাইপটিকে ফিট করে। আমি মনে করি বর্ণনাটি বিভ্রান্তিকর, তবে স্পষ্টত নির্মাণ সবসময় ভাল তবে নির্মাণের পূর্বে অন্তর্ভুক্ত রূপান্তর।
জেএইচবিওনারিয়াস

উত্তর:


2

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

এটি স্বয়ংক্রিয়ভাবে পুনরাবৃত্তিকারীদের থেকে সেই নির্মাণকে সমর্থন করার জন্য সিকোয়েন্স পাত্রে অস্বীকৃতি দেয় না যা আমি যতটা বলতে পারি 1 যে মানদণ্ডটি পূরণ করে না । সে সম্পর্কে সুস্পষ্ট নিয়ম রয়েছে:

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

"ইনপুট পুনরাবৃত্তকারী হিসাবে যোগ্যতা অর্জন করা" এর প্রসঙ্গে ঠিক কী অর্থ তা অস্পষ্ট। এটি কি সিপিপি 17 ইনপুটআইটিরেটর প্রকাশ করার জন্য অনানুষ্ঠানিক উপায়, বা এটি আই এবং জে প্রয়োজনীয়তার সাথে উল্লেখ করার চেষ্টা করে? আমি জানি না। এটি অনুমোদিত বা না হোক, এটি সনাক্ত করার জন্য স্ট্যান্ডার্ডের কোনও কঠোর প্রয়োজন নেই:

[Container.requirements.general]

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

যে কোনও সিপিসি 17 ইনপুটটিটর "ইনপুট পুনরাবৃত্তকারী হিসাবে যোগ্যতা অর্জন করে" এই ব্যাখ্যার সাথে উদাহরণস্বরূপ প্রোগ্রামটি খারাপ-গঠনের প্রয়োজন হবে না। তবে এটিরও সুগঠিত হওয়ার নিশ্চয়তা নেই।

1 এই ক্ষেত্রে, এটি নির্ভর করার সময় সতর্ক করার জন্য এটি বাস্তবায়নের সমস্যার মান হিসাবে বিবেচিত হতে পারে। অন্যদিকে, অন্তর্নিহিত রূপান্তরগুলির এই সীমাবদ্ধতাটিকে একটি ত্রুটি হিসাবে বিবেচনা করা যেতে পারে ।


PS এটি ক্ল্যাং (libc ++ সহ) এবং এমএসভিসি-তে সতর্কতা ছাড়াই সংকলন করে।

পিপিএস এই শব্দটিকে সি ++ 11-এ যুক্ত করা হয়েছে বলে মনে হয় (যা প্রাকৃতিক, ততক্ষণে স্পষ্টত নির্মাতারাও চালু করেছিলেন)।


1
সত্যিই "ইনপুট পুনরাবৃত্তকারী হিসাবে যোগ্যতা অর্জন করে না" তার অর্থের উপর নির্ভর করে । উপরের বিপরীতে , এটি আসলে বলে না Cpp17InputIterator, সুতরাং এটি "value_type আমার কাছে পরিষ্কার নয় " এবং "ইনপুট পুনরাবৃত্তকারী" এর মধ্যে অন্তর্নিহিত রূপান্তরিত উপাদানগুলিকে " অন্তর্ভুক্ত করা হয়েছে কিনা"। যদি এটি হয় তবে কনস্ট্রাক্টরকে ওভারলোড রেজোলিউশনে অংশ নেওয়া উচিত নয় এবং প্রোগ্রামটি খারাপ-গঠন হওয়া উচিত।
ম্যাক্স ল্যাঙ্গোফ

1
সুতরাং, প্রতিটি স্ট্যান্ডার্ড লাইব্রেরি ক্লাসে ডায়গনিস্টিক জারি না করে অতিরিক্ত কনস্ট্রাক্টর থাকার অনুমতি রয়েছে যখন এই অতিরিক্ত কনস্ট্রাক্টর ব্যবহার করা হয়? এটি স্বজ্ঞাতভাবে আমার কাছে ভুল বলে মনে হচ্ছে ...
ব্রায়ান

@ ব্রায়ান আমি এটির "অতিরিক্ত নির্মাণকারী" কিনা নিশ্চিত নই, তবে সম্ভবত আরও "কন্সট্রাক্টরগুলির নির্দিষ্ট বাস্তবায়ন যা আরও বেশি জায়গার অনুমতি দেয়"। প্রতিটি ইনপুট চেক করা গুরুত্বপূর্ণ পারফরম্যান্সের প্রভাব ফেলতে পারে, তাই আমি জানি না যে সেভাবে যাওয়ার
উপায়টি ছিল কিনা

@ ব্রায়ান স্পষ্টভাবে বঞ্চিত না হলেও এটি অবশ্যই একটি খারাপ ধারণা হবে। এই ক্ষেত্রে আমরা কেবল বিবেচনা করছি যে কোনও প্রয়োজনীয় কনস্ট্রাক্টরকে এমন ধরণের পুনরাবৃত্তিকারীদের সমর্থন করার অনুমতি দেওয়া হয় যা এটি সমর্থন করার প্রয়োজন হয় না। এই ক্ষেত্রে ম্যাক্স দ্বারা নির্দেশিত হিসাবে স্পষ্টত "অংশ নেবে না" প্রয়োজনীয়তা রয়েছে যা অবশ্যই এটিকে অস্বীকার করবে। তবে "ইনপুট পুনরাবৃত্তকারী হিসাবে যোগ্যতা অর্জন করা" এর অর্থ প্রসঙ্গে ঠিক কী তা স্পষ্ট নয়। এটা প্রকাশ করার অনানুষ্ঠানিক উপায় আছে কি Cpp17InputIterator, অথবা এটি প্রয়োজনীয়তা পড়ুন করার প্রচেষ্টা নেই iএবং j? আমি জানি না।
এরেরিকা

2
1) সি ++ এ আমরা মানটি কম সেট করি। । 2) কনস্ট্রাক্টরগুলি নন-ভার্চুয়াল সদস্য ফাংশন । 3) এলডাব্লুজি 3297 দেখুন ; তবে আমি বিশেষভাবে নিশ্চিত নই যে আমাদের অন্তর্নিহিত রূপান্তর প্রয়োজনীয়তা সরিয়ে নেওয়া উচিত।
টিসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.