2015-07-02 4 views
15

एक खाली प्रारंभकर्ता सूची के साथ std::min() पर कॉलिंग आमतौर पर संकलित नहीं होती है (सभी प्रश्न std::max() के लिए उसी तरह से कहा जा सकता है)। इस कोड:एक खाली प्रारंभकर्ता सूची (और स्पष्ट रूप से प्रकार निर्दिष्ट) पर std :: min को कॉल कर रहा है अपरिभाषित व्यवहार?

#include <iostream> 
#include <algorithm> 

int main() { 
    std::cout << std::min({}) << "\n"; 
    return 0; 
} 
बजना के साथ

इस त्रुटि देता है:

test.cpp:6:17: error: no matching function for call to 'min' 
    std::cout << std::min({}) << "\n"; 
       ^~~~~~~~ 
algorithm:2599:1: note: 
     candidate template ignored: couldn't infer template argument '_Tp' 
min(initializer_list<_Tp> __t) 

मैं क्यों इस मामले अनुमति नहीं दी जाएगी देख सकते हैं, क्योंकि यह एक समझदार मूल्य पर सहमत करने के लिए इस मामले में वापस जाने के लिए मुश्किल है ।

हालांकि, तकनीकी रूप से कोड बोलना केवल संकलित नहीं होता है क्योंकि टेम्पलेट पैरामीटर को घटाया नहीं जा सकता है। अगर मैं पैरामीटर कोड संकलित मजबूर है, लेकिन मैं एक दुर्घटना मिलती है:

#include <iostream> 
#include <algorithm> 

int main() { 

    std::cout << std::min<int>({}) << "\n"; 

    return 0; 
} 

$ clang++ -std=c++11 test.cpp -o test 
$ ./test 
Segmentation fault: 11 

यह दुर्घटना पैदा होती है क्योंकि std::min()std::min_element() के मामले में लागू किया गया है लगता है, और एक खाली प्रारंभकर्ता सूची गलत end() इटरेटर की भिन्नता में यह परिणाम है।

तो कोड का यह टुकड़ा सी ++ 11/सी ++ 14 के तहत अपरिभाषित व्यवहार है? std::min() स्पष्ट टेम्पलेट पैरामीटर के बिना बुलाए जाने पर संकलित नहीं किया गया है? std::min()std::min_element() के संदर्भ में लागू किया गया है?

+0

मुझे यह विशेष रूप से कुछ भी करने की उम्मीद नहीं थी। – gigabytes

+0

मैं मानता हूं कि सिद्धांत में कोई अच्छा जवाब नहीं है। मैं इसे प्रश्न में भी बताता हूं। लेकिन चूंकि इसे आविष्कार करने का एक तरीका संकलित करता है और दूसरा नहीं, मैंने पूछा कि क्या संकलित करने वाला व्यक्ति वास्तव में यूबी के रूप में निर्दिष्ट किया गया था। – gigabytes

उत्तर

22

हां, यह यूबी है। के अनुसार सी ++ 14 (n4140) 25.4.7/4:

template <class T> 
constexpr T min(initializer_list<T> t); 

...

4 Requires:T is LessThanComparable and CopyConstructible and t.size() > 0.

(जोर मेरा)

उन्हीं शब्दों का में सी ++ 11 के साथ-साथ मौजूद है।

+0

मेरा बुरा ... मैंने मानक को देखा और किसी कारण से मैंने पूरी तरह से 't.size()> 0' आवश्यकता को याद किया है! – gigabytes

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