max({"a", "b", "z", "x"}); returns "x"
जबकि दोनोंसी प्रारंभकर्ता सूची के साथ ++ के अधिकतम() तार रिटर्न आदेश से बाहर
max<std::string>({"a", "b", "z", "x"});
और
max({'a', 'b', 'z', 'x'});
वापसी "Z" के रूप में वे चाहिए। क्यूं कर?
max({"a", "b", "z", "x"}); returns "x"
जबकि दोनोंसी प्रारंभकर्ता सूची के साथ ++ के अधिकतम() तार रिटर्न आदेश से बाहर
max<std::string>({"a", "b", "z", "x"});
और
max({'a', 'b', 'z', 'x'});
वापसी "Z" के रूप में वे चाहिए। क्यूं कर?
"a"
, "b"
आदि स्ट्रिंग अक्षर हैं। शुरुआती सूची में जब ये क्षय const char*
पर होता है। max
बस
शायद उच्चतम पते वाले व्यक्ति को प्राप्त करता है, लेकिन चूंकि यह उनकी तुलना करने के लिए operator<
का उपयोग करता है, और वे एक ही सरणी का हिस्सा नहीं हैं, या एक ही सरणी के पिछले एक हैं, तुलना का परिणाम निर्दिष्ट नहीं है (और max
का आविष्कार अपरिभाषित व्यवहार होगा, क्योंकि आवश्यकता यह है कि प्रकार LessThanComparable
हो)।
max
के अन्य दो आमंत्रण अच्छी तरह परिभाषित हैं। char
जैसे a
, b
इत्यादि तुलनात्मक रूप से कम परिभाषित कम से कम अभिन्न प्रकार हैं। और std::string
में operator<
है जो एक शब्दावली तुलना लागू करता है।
max({"a", "b", "z", "x"});
पॉइंटर्स की तुलना करने का प्रयास करता है। इसने अपरिभाषित व्यवहार किया है (क्योंकि व्यक्तिगत तुलना के परिणाम अनिर्दिष्ट हैं)। यह आप आप लिखना चाहिए, संकेत तुलना करने के लिए चाहता था:
std::max({"a", "b", "z", "x"}, std::less<const char*>());
इसके विपरीत, max({'a', 'b', 'z', 'x'});
अभिन्न मान की तुलना करके max<std::string>
तार तुलना करती है।
व्यवहार अपरिभाषित क्यों है? –
@ P45Imminent: पॉइंटर ऑपरेंड के लिए '<' ऑपरेटर केवल पॉइंटर्स के लिए समान सामान्य ऑब्जेक्ट के उप-प्रोजेक्ट के लिए परिभाषित किया गया है। –
धन्यवाद। Upvoted! –
तुलना का परिणाम निर्दिष्ट नहीं है, अपरिभाषित नहीं है। –
@ टी.सी. क्या आपके पास इसका संदर्भ है? मुझे लगता है कि अगर इसे अनिर्दिष्ट किया गया था, तो यह सख्त कमजोर आदेश प्रदान न करने के कारण, 'अधिकतम' अपरिभाषित के तहत अभी भी एक आमंत्रण करेगा। – juanchopanza
[expr.rel]/p4 की अंतिम वाक्य। सख्त कमजोर आदेश के बारे में अच्छा बिंदु, यद्यपि। –