2013-03-08 10 views
5

g++-std=c++11 साथ यह स्वीकार करने के लिए लगता है:इस कोड में कोई संकुचित रूपांतरण क्यों नहीं है, जिसके परिणामस्वरूप त्रुटि हुई है?

#include <vector> 
#include <initializer_list> 

std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)? 

int main() {} 

यह प्रतीत होता है कि टिप्पणी के साथ लाइन बाहर त्रुटि चाहिए, लेकिन ऐसा नहीं है।

अद्यतन

standardese (8.5.4 p7) को परिभाषित करता है यही कारण है कि यह ठीक है की ओर इशारा करते के लिए जेसी के लिए धन्यवाद।

const int v5=5; 
int v6=6; 

vector<double> vd1={1,2,3,4};  // OK 
vector<double> vd2={1,2,3,4,v5}; // Still OK, v5 is const 
vector<double> vd3={1,2,3,4,v5,v6}; // Error, narrowing conversion, because v6 
            // is non-const 
vector<double> vd4={1,2,3,4,v5,static_cast<const int>(v6)}; // Also errors on 
            // gcc 4.7.2, not sure why. 

मुझे आशा है कि मैं सिर्फ उदाहरण प्रस्तुत दूसरों की मदद करेगा जब प्रारंभकर्ता सूचियों का उपयोग कर पिछले कुछ संकुचन मुद्दों पाने के लिए: यहां कुछ नमूना कोड व्यवहार मानक द्वारा परिभाषित स्पष्ट करने के लिए मदद करता है।

यदि कोई जानता है कि आखिरी मामला मानक परिभाषा का उल्लंघन क्यों करता है, तो कृपया एक टिप्पणी पोस्ट करें।

+0

तुम्हें क्या लगता है यह संकुचन है करते हैं? –

+3

संकीर्णता 'फ्लोट' से 'int' –

+0

होगी कि रूपांतरण कैसे संकीर्ण हो रहा है? जीसीसी [चेतावनी जारी करता है] (http://liveworkspace.org/code/1FWK1L$2) जब संकुचित किया जाता है, और आप इसे '-pedantic-error'' के साथ संकलित करके एक त्रुटि में बदल सकते हैं (http: // liveworkspace.org/code/1FWK1L$1)। – Praetorian

उत्तर

10

नियम 8.5.4 p7 जो अपने उदाहरण शामिल नहीं कर रहे हैं

एक पूर्णांक प्रकार या फ्लोटिंग प्वाइंट को unscoped गणना प्रकार प्रकार, जहां स्रोत एक निरंतर अभिव्यक्ति और रूपांतरण के बाद वास्तविक मूल्य लक्ष्य Ty में फिट होगा सिवाय से

पे और मूल मूल्य, या नरक पर वापस परिवर्तित होने पर मूल मान का उत्पादन करेगा;

(जोर मेरा)

+0

संदर्भ के लिए अच्छा खोज और धन्यवाद। मुझे पता नहीं था कि निरंतर अभिव्यक्तियों का अलग-अलग व्यवहार किया गया था। –

+0

+1 दूसरे शब्दों में, कोई जानकारी हानि नहीं हो सकती –

+0

कोई विचार क्यों मेरा आखिरी उदाहरण एक संकीर्ण त्रुटि उत्पन्न करता है? –

7

मुझे नहीं पता कि यह क्यों त्रुटि होनी चाहिए कि सभी तीन पूर्णांक को float के रूप में बिल्कुल दर्शाया जा सकता है।

कहा कि, मैं g++ मिल मुझे एक चेतावनी देने के लिए कर सकते हैं अगर मैं एक निरंतर है कि एक float में फिट नहीं करता है में शामिल हैं:

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing] 
संबंधित मुद्दे

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