2011-08-11 7 views
11

swap समारोह टेम्पलेट C++ 0x में <utility> को <algorithm> से ले जाया गया था। क्या पूर्व में बाद में सी ++ 0x में शामिल है? या क्या वे दोनों एक सामान्य शीर्षलेख शामिल करते हैं जो swap को परिभाषित करता है?क्या std :: swap अभी भी C++ 0x में एल्गोरिदम समेत परिभाषित किया जाएगा?

दूसरे शब्दों में, निम्न कोड C++ 0x में संकलित करने के लिए गारंटी है?

#include <algorithm> // will this pull in std::swap? 

// ... 

using std::swap; 
swap(a, b); 

उत्तर

15

एफ डी आई (n3290), अनुलग्नक सी में, "संगतता", C.2.7 का कहना है:

17.6.3.2

ई एफएफ मूल विशेषता पर ect: समारोह स्वैप एक di एफएफ erent में ले जाया गया शीर्षलेख

तर्क: स्वैप के लिए < एल्गोरिदम > पर निर्भरता निकालें।

ई एफएफ ect मूल विशेषता पर: मान्य सी ++ 2003 कोड है कि उम्मीद स्वैप < एल्गोरिथ्म > में होने की बजाय < उपयोगिता > शामिल करने के लिए हो सकता है संकलित किया गया है।

तो नहीं, यह संकलन करने की गारंटी नहीं है, यह जानबूझकर एक तोड़ने वाला परिवर्तन है। चाहे व्यक्तिगत कार्यान्वयन वास्तव में सी ++ 03 कोड तोड़ देगा, एक और मामला है। जैसा कि आप इंगित करते हैं कि उनके लिए हेडर के माध्यम से swap को परिभाषित करके, उनके लिए इतना आसान नहीं है। लेकिन सी ++ 0x पर पोर्ट सी ++ 03 कोड को आसान बनाने के बीच एक विकल्प है, बनाम लोगों को सख्ती से सी ++ 0x अनुरूप बनाने में मदद करना।

+0

क्यों नहीं 'std :: swap' हमेशा अंदर' ' रह रहा? :) – fredoverflow

+1

समिति इस पर पहिया पर सो रही थी। ' 'में' एल्गोरिदम 'का उपयोग करें' स्वैप 'का उपयोग करें, और इसलिए यह दायरे में होना चाहिए। हमें गारंटी देनी चाहिए कि '' अभी भी 'स्वैप' में खींचता है, क्योंकि अभ्यास में यह हमेशा * होगा। जैसे 'int i, j; std :: iter_swap (और मैं, &j); '* * काम है करने के लिए –

+0

@Howard: और यह सही है कि एक बार प्रयोक्ता परिभाषित प्रकार खेलने में लाया जाता है, यह * चाहिए * हो" असली "' std :: swap' प्रयोग किया जाता है उन एल्गोरिदम द्वारा, केवल कुछ अन्य कोड नहीं जो मूल्यों को स्वैप करने का प्रभाव रखते हैं, क्योंकि उपयोगकर्ता 'std :: swap' और एल्गोरिदम का विशेषज्ञ हो सकता है, फिर विशेषज्ञता का उपयोग करना चाहिए? –

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