2015-07-01 3 views

उत्तर

14

"a", "b" आदि स्ट्रिंग अक्षर हैं। शुरुआती सूची में जब ये क्षय const char* पर होता है। max बस शायद उच्चतम पते वाले व्यक्ति को प्राप्त करता है, लेकिन चूंकि यह उनकी तुलना करने के लिए operator< का उपयोग करता है, और वे एक ही सरणी का हिस्सा नहीं हैं, या एक ही सरणी के पिछले एक हैं, तुलना का परिणाम निर्दिष्ट नहीं है (और max का आविष्कार अपरिभाषित व्यवहार होगा, क्योंकि आवश्यकता यह है कि प्रकार LessThanComparable हो)।

max के अन्य दो आमंत्रण अच्छी तरह परिभाषित हैं। char जैसे a, b इत्यादि तुलनात्मक रूप से कम परिभाषित कम से कम अभिन्न प्रकार हैं। और std::string में operator< है जो एक शब्दावली तुलना लागू करता है।

+0

तुलना का परिणाम निर्दिष्ट नहीं है, अपरिभाषित नहीं है। –

+0

@ टी.सी. क्या आपके पास इसका संदर्भ है? मुझे लगता है कि अगर इसे अनिर्दिष्ट किया गया था, तो यह सख्त कमजोर आदेश प्रदान न करने के कारण, 'अधिकतम' अपरिभाषित के तहत अभी भी एक आमंत्रण करेगा। – juanchopanza

+0

[expr.rel]/p4 की अंतिम वाक्य। सख्त कमजोर आदेश के बारे में अच्छा बिंदु, यद्यपि। –

12

max({"a", "b", "z", "x"}); पॉइंटर्स की तुलना करने का प्रयास करता है। इसने अपरिभाषित व्यवहार किया है (क्योंकि व्यक्तिगत तुलना के परिणाम अनिर्दिष्ट हैं)। यह आप आप लिखना चाहिए, संकेत तुलना करने के लिए चाहता था:

std::max({"a", "b", "z", "x"}, std::less<const char*>()); 

इसके विपरीत, max({'a', 'b', 'z', 'x'}); अभिन्न मान की तुलना करके max<std::string> तार तुलना करती है।

+0

व्यवहार अपरिभाषित क्यों है? –

+4

@ P45Imminent: पॉइंटर ऑपरेंड के लिए '<' ऑपरेटर केवल पॉइंटर्स के लिए समान सामान्य ऑब्जेक्ट के उप-प्रोजेक्ट के लिए परिभाषित किया गया है। –

+0

धन्यवाद। Upvoted! –

संबंधित मुद्दे