2016-10-20 28 views
5

के बीच टर्नरी ऑपरेटर के कॉन्स्ट संदर्भ के पते पर अंतर मुझे क्या हो रहा है इसका एक अस्पष्ट विचार है ... और इसे this के साथ करना है, लेकिन मुझे आश्चर्य है कि क्यों clang ++ और g ++ इसे अलग-अलग संभालते हैं। यहां अपरिभाषित व्यवहार कहां है? नोट: इसका टेम्पलेट्स से कोई लेना-देना नहीं है - उदाहरण के लिए मैं उदाहरण का अधिक कॉम्पैक्ट बनाने के लिए उनका उपयोग करता हूं। यह सब whatever के प्रकार के बारे में है।क्लैंग और जीसीसी

#include <iostream> 
#include <vector> 

template <typename T> 
void test() 
{ 
    T whatever = 'c'; 


    const char a = 'a'; 

    std::cout << "begin: " << (void*)&a << std::endl; 

    const char & me = (true ? a : whatever); 

    std::cout << "ref: " << (void*)&me << std::endl; 
} 

int main(int argc, char**argv) 
{ 

    test<const char>(); 
    test<char>(); 

    return 0; 
} 

जीसीसी निर्गम (4.9.3 अप करने के लिए परीक्षण किया):

begin: 0x7fffe504201f 
ref: 0x7fffe504201f 
begin: 0x7fffe504201e 
ref: 0x7fffe504201f 

बजना 3.7.0 उत्पादन:

begin: 0x7ffed7b6bb97 
ref: 0x7ffed7b6bb97 
begin: 0x7ffed7b6bb97 
ref: 0x7ffed7b6bb97 
+0

शायद 'char a' के लिए reducable; कॉन्स चार बी; कॉन्स चार और आर = (सच? ए: बी); std :: cout << (& a == &r); ' –

+0

जीसीसी 4.9.2 पर पुन: उत्पादित, 5.3.0 और 6.1 – krzaq

+0

पर विफल हुआ जीसीसी 6.2.1 पर पुन: उत्पन्न करने में विफल। – Rakete1111

उत्तर

0

this other question from today से मेरा जवाब विस्तार से अपने मामलों को शामिल किया गया। मैं खुद को दोहराने से बचूंगा और बस सारांशित करूंगा।

यदि हम टेम्पलेट्स को कारक करते हैं तो आपके पास दो मामले हैं। केस 1:

const char whatever = 'c'; 
const char a = 'a'; 
const char & me = (true ? a : whatever); 

सशर्त ऑपरेटर की दूसरी और तीसरी ऑपरेंड दोनों "प्रकार const char की lvalue" हैं, इसलिए परिणाम "प्रकार const char की lvalue" चयनित संकार्य तय किया है। अंत में, const char & सीधे "const char प्रकार के लाभा" से बांधता है, इसलिए &me == &a

मामले 2 के लिए:

char whatever = 'c'; 
const char a = 'a'; 
const char & me = (true ? a : whatever); 

दूसरे और तीसरे संकार्य "प्रकार char की lvalue" और "प्रकार const char की lvalue" कर रहे हैं। इसका परिणाम चयनित ऑपरेंड नामित "const char प्रकार का प्रकार" है। पहले की तरह, const char &me सीधे const char के प्रकार के अंतराल पर बांधता है, इसलिए &me == &a

यदि कोई कंपाइलर किसी भी मामले में me और a के लिए अलग-अलग पते प्रिंट करता है, तो यह एक कंपाइलर बग है।

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