Std :: स्पैन में तुलना ऑपरेटरों की कमी क्यों है?


10

/ / सादे सरणी और एक जैसे std::spanउप-क्षेत्रों के लिए एक हल्के संदर्भ के रूप में डिज़ाइन नहीं किया गया था ? क्या इसके एपीआई में तुलनात्मक संचालक नहीं होने चाहिए, उनके अनुरूप होना चाहिए? अपवर्जन के पीछे तर्क क्या था?std::vectorstd::array

नोट: तुलना ऑपरेटरों द्वारा, मैं या तो पूरा सेट मतलब ( <, <=, ...) या अंतरिक्ष यान<=>


महान सवाल IMO, Im एक ही सोच। operator==भी गायब है। Esp। वेक्टर के लिए मुझे अक्सर सीधे तुलना करना सुविधाजनक लगता है। यह स्थिर आकार अवधि प्रकार के साथ कठिनाइयों के कारण हो सकता है, हालांकि मुझे यकीन नहीं है।
सुबह

यह gsl :: span की तरह दिखता है, जिसमें से std :: span का वर्जन होता है, इसमें ये दोनों शामिल नहीं होते हैं।
दारुन

1
@DanielLangr क्यों नहीं एक lexicographic तुलना की तरह है std::vectorऔर std::arrayकरते हैं? वे पहले से ही उन प्रकारों के लिए उसी तरह परिभाषित हैं, इसलिए यहां नहीं।
तिमो

2
ध्यान दें कि P0122R7 के लिए तुलना का प्रस्ताव है span, लेकिन वर्तमान मसौदा मानक में यह शामिल नहीं है।
डैनियल लैंगर

1
@darune gsl::span करता है (और हमेशा किया) तुलना ऑपरेटरों है। वे उन्हें अपने हेडर
बैरी

जवाबों:


3

जैसा कि डैनियल लैंगर ने बताया , std::spanइसके शुरुआती प्रस्ताव P0122 में तुलना ऑपरेटर हैं । इन ऑपरेटरों को काम के मसौदे N4791 के बाद से हटा दिया जाता है , और इसका कारण P1085 में बताया गया है ।

संक्षेप में, std::span"उथले" के लिए प्रतिलिपि और कॉन्स्टेंस हैं (जिसका अर्थ std::spanहै कि इसकी अंतर्निहित तत्वों की प्रतिलिपि नहीं है, और एक कॉस्ट std::spanइसके अंतर्निहित तत्वों को संशोधित होने से नहीं रोकता है), इसलिए तुलना, यदि मौजूद है, तो "उथले" भी होना चाहिए स्थिरता के लिए।

वह कागज निम्नलिखित उदाहरण देता है:

उदाहरण 1:

T oldx = x;
change(x);
assert(oldx != x);
return oldx;

उदाहरण 2:

void read_only(const T & x);

void f()
{
  T tmp = x;
  read_only(x);
  assert(tmp == x);
}

इन उदाहरणों में अभिकथन विफल हो सकता है T = std::span, जबकि यह नियमित प्रकारों के लिए नहीं है।

कोई तर्क दे सकता है कि std::string_viewउथली प्रतिलिपि है लेकिन गहरी तुलना। P1085 ने इसके लिए एक स्पष्टीकरण भी दिया है:

यह मैच string_view, हालांकि, string_viewइसके द्वारा इंगित किए गए तत्वों को संशोधित नहीं कर सकता है, और इस प्रकार उथले प्रति को string_viewकॉपी-ऑन-राइट ऑप्टिमाइज़ेशन के समान माना जा सकता है।


ध्यान दें कि कुछ भी नहीं चरित्र सरणी के मालिक को मूल भंडारण को संशोधित करने से रोकता है जबकि std::string_viewयह इंगित करता है। तो, कहते हैं, std::map<std::span<T>, U>के रूप में के रूप में टूट गया है std::map<std::string_view, U>। IMHO, std::string_viewतुलना संचालकों को शामिल नहीं करना चाहिए।
लिबर्टा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.