मान लीजिए मैं एक समारोह है, इस तरह कहा जाता है:है और एआर [आकार] वैध है?
void mysort(int *arr, std::size_t size)
{
std::sort(&arr[0], &arr[size]);
}
int main()
{
int a[] = { 42, 314 };
mysort(a, 2);
}
मेरा प्रश्न है: mysort
का कोड (खासतौर पर, &arr[size]
) व्यवहार को परिभाषित किया है करता है?
मुझे पता है कि arr + size
द्वारा प्रतिस्थापित किया गया है तो यह पूरी तरह वैध होगा; पॉइंटर अंकगणित सामान्य रूप से अतीत को इंगित करने की अनुमति देता है। हालांकि, मेरा प्रश्न विशेष रूप से &
और []
के उपयोग के बारे में है।
प्रति सी ++ 11 5.2.1/1, arr[size]
*(arr + size)
के बराबर है।
5.3.1/1 का हवाला देते हुए, एकल *
के लिए नियम: अभिव्यक्ति के लिए जो इसे एक ऑब्जेक्ट प्रकार करने के लिए एक सूचक होगा लागू किया जाता है, या:
एकल
*
ऑपरेटर अविवेक करता है फ़ंक्शन प्रकार के लिए पॉइंटर और परिणाम ऑब्जेक्ट या पर संदर्भित एक लवली है जिसमें अभिव्यक्ति इंगित करती है। अगर अभिव्यक्ति के प्रकार है "सूचकT
के लिए," परिणाम के प्रकार के "T
है।" [नोट: एक अधूरी प्रकार (सीवीvoid
को छोड़कर) के लिए सूचक dereferenced जा सकता है। इस प्रकार प्राप्त किया गया लाभा सीमित तरीकों से उपयोग किया जा सकता है (उदाहरण के लिए संदर्भ शुरू करने के लिए); यह lvalue प्रसार में परिवर्तित नहीं किया जाना चाहिए, 4.1 देखें। अंत टिप्पणी]
अंत में, 5.3.1/3 &
के लिए नियमों को दे रही है:
एकल
&
ऑपरेटर का परिणाम अपने संकार्य के लिए सूचक है। ऑपरेंड एक लवल्यू होगा ... यदि का प्रकारT
है, तो परिणाम "सूचक सेT
" टाइप किया गया है और यह एक अनुमान है कि नामित ऑब्जेक्ट (1.7) या पॉइंटर के लिए एक सूचक है नामित समारोह
(जोर और अंडाकार खान)।
मैं इस बारे में अपना मन बिल्कुल तैयार नहीं कर सकता। मुझे यकीन है कि arr[size]
पर एक लवली-टू-रावल्यू रूपांतरण को मजबूर करना अनिर्धारित होगा। लेकिन कोड में ऐसा कोई रूपांतरण नहीं होता है। arr + size
किसी ऑब्जेक्ट को इंगित नहीं करता है; लेकिन उपरोक्त पैराग्राफ ऑब्जेक्ट्स के बारे में बात करते हैं, लेकिन वे किसी ऑब्जेक्ट के लिए उस स्थान पर वास्तव में मौजूद होने की आवश्यकता को स्पष्ट रूप से प्रकट नहीं करते हैं (उदाहरण के विपरीत 4.1/1 में lvalue-to-rvalue रूपांतरण)।
तो, खोज है: mysort
है, जिस तरह से इसे वैध या नहीं कहा जाता है?
(ध्यान दें कि मैं उपरोक्त सी ++ 11 उद्धृत कर रहा हूं, लेकिन यदि इसे बाद के मानक/ड्राफ्ट में अधिक स्पष्ट रूप से संभाला जाता है, तो मैं इसके साथ पूरी तरह से खुश हूं)।
कोई डुप्लिकेट नहीं है, @ एंज्यू जानता है कि: मेरा विश्वास करो। – Bathsheba
निश्चित नहीं है लेकिन [basic.compound] अनुच्छेद 3 * में नोट के बारे में क्या है [नोट: उदाहरण के लिए, किसी सरणी (5.7) के अंत में वाला पता सरणी के तत्व की एक असंबंधित वस्तु को इंगित करने के लिए माना जाएगा टाइप करें जो उस पते पर स्थित हो सकता है। गतिशील भंडारण अवधि वाले ऑब्जेक्ट्स पर पॉइंटर्स पर और प्रतिबंध हैं; 3.7.4.3 देखें। -जेंड नोट] * – NathanOliver
क्या कोई मुझे बता सकता है कि संभावित डुप्लिकेट की तुलना में इस प्रश्न में नया क्या है? ऐसा लगता है कि वहां से जवाब की प्रतिलिपि बनाने से वास्तव में इस प्रश्न का उत्तर भी मिलेगा। –