libC++

2015-10-03 12 views
6

में std :: min के लिए कोई हानिकारक संदर्भ std::minconst संदर्भ के परिणाम को बाध्यकारी एक बहुत बुरा विचार है, जब भी std::min के तर्कों में से एक एक रैल्यू है, चूंकि const संदर्भ बाध्यकारी फ़ंक्शन रिटर्न के माध्यम से प्रचारित नहीं है। तो निम्न कोडlibC++

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    int n = 42; 
    const int& r = std::min(n - 1, n + 1); // r is dangling after this line 
    std::cout << r; 
} 

अपरिभाषित व्यवहार का उत्पादन करना चाहिए क्योंकि r झूलते है। और वास्तव में, जब -Wall -O3 साथ gcc5.2 साथ संकलन संकलक थूक

चेतावनी: <anonymous> इस समारोह [-Wuninitialized] में अप्रारंभीकृत प्रयोग किया जाता है

हालांकि, बजना साथ संकलन (LLVM 7.0.0) एक ही झंडे का उपयोग करके (-Wextra सहित) किसी भी चेतावनी को उत्सर्जित नहीं करता है, और प्रोग्राम "काम" लगता है, यानी 41 प्रदर्शित करता है।

प्रश्न: क्या std::min के "सुरक्षित" संस्करण का उपयोग कर क्लैंग है? किसी ऐसे संस्करण की तरह जो मूल्य से वापस आने के लिए कुछ SFINAE का उपयोग करता है जब भी तर्कों में से एक एक रावल्यू है? या क्या यह किसी भी निदान को उत्सर्जित करने की आवश्यकता नहीं है और कार्यक्रम इस यूबी परिदृश्य में "सही" परिणाम उत्पन्न करने के लिए "होता है"?

+1

अपरिभाषित व्यवहार अपरिभाषित है ... –

+0

@ टी.सी. हां, मुझे पता है, सिर्फ curios था कि क्या यह तय किया गया है, क्योंकि यह एक प्रसिद्ध मुद्दा है, और किसी भी चेतावनी को उत्सर्जित नहीं करता है। – vsoftco

उत्तर

6

यह यूबी है। libC++ किसी भी तरह से इससे आपकी रक्षा नहीं करता है।

+0

ठीक है, मैं आपको विश्वास करता हूं, धन्यवाद :) – vsoftco

+1

यह यूबी का सबसे नास्टेस्ट प्रकार है - ऐसा लगता है कि यह ठीक काम करता है। –

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