में std :: min के लिए कोई हानिकारक संदर्भ std::min
const
संदर्भ के परिणाम को बाध्यकारी एक बहुत बुरा विचार है, जब भी 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 का उपयोग करता है जब भी तर्कों में से एक एक रावल्यू है? या क्या यह किसी भी निदान को उत्सर्जित करने की आवश्यकता नहीं है और कार्यक्रम इस यूबी परिदृश्य में "सही" परिणाम उत्पन्न करने के लिए "होता है"?
अपरिभाषित व्यवहार अपरिभाषित है ... –
@ टी.सी. हां, मुझे पता है, सिर्फ curios था कि क्या यह तय किया गया है, क्योंकि यह एक प्रसिद्ध मुद्दा है, और किसी भी चेतावनी को उत्सर्जित नहीं करता है। – vsoftco