2012-12-05 28 views
8

बूस्ट :: एएसओ का उपयोग करने वाले कोड का निम्नलिखित बिट लें।अजीब सी 4512 चेतावनी। क्यूं कर?

#include <boost/asio.hpp> 

using boost::asio::ip::tcp; 

class SocketTest 
{ 

private:    

    boost::asio::io_service& mIOService; 
    tcp::acceptor mAcceptor; // Comment this line 

public: 

    SocketTest(boost::asio::io_service& io_service) 
     : mIOService(io_service) 
     , mAcceptor(io_service, tcp::endpoint(tcp::v4(), 8080)) // Comment this line 
    {  
    } 
}; 

आप दो में चिह्नित लाइनों टिप्पणी तो संकलक (दृश्य स्टूडियो 2010) निम्न चेतावनी जब/W4 पर संकलन बाहर देता है।

warning C4512: 'SocketTest' : assignment operator could not be generated 

उन दो पंक्तियों को इतना खास बनाता है क्या? उनका अस्तित्व असाइनमेंट ऑपरेटर की पीढ़ी की अनुमति क्यों देता है?

उत्तर

7

इस व्यवहार का कारण यह है कि tcp::acceptor कॉपी करने योग्य नहीं है (यह basic_io_object से प्राप्त होता है, जिसका प्रतिलिपि असाइनमेंट ऑपरेटर निजी है, इसलिए इसकी प्रतिलिपि असाइनमेंट ऑपरेटर को निश्चित रूप से घोषित नहीं किया जाता है)। एक गैर-प्रतिलिपि बनाने वाला सदस्य निहित घोषित प्रति असाइनमेंट ऑपरेटर की पीढ़ी से बचाता है, लेकिन चेतावनी नहीं उठाता क्योंकि इसे अपेक्षित व्यवहार माना जाता है।

दूसरी ओर, यदि आप उन दो पंक्तियों पर टिप्पणी करते हैं, तो आपकी कक्षा केवल संदर्भ सदस्य के साथ छोड़ दी जाती है; यह आपकी कक्षा को गैर-प्रतिलिपि बनाता है, लेकिन विजुअल स्टूडियो दस्तावेज़ के अनुसार चेतावनी उठाता है। मैं मानता हूं कि यह भी अपेक्षित है, लेकिन कंपाइलर कार्यान्वयनकर्ताओं ने आपको मामले में चेतावनी देने का फैसला किया है। इसका कारण यह हो सकता है कि कक्षा को स्पष्ट रूप से गैर-प्रतिलिपि बनाने योग्य (जैसे basic_io_object के मामले में) एक स्पष्ट डिजाइन निर्णय है, लेकिन मैं बस अनुमान लगा रहा हूं।

+0

आह, हाँ। आप सही लगते हैं। बढ़ावा से विरासत :: noncopyable चेतावनी हल किया। यह भी बताता है कि एक परमाणु प्रकार (int और int) के साथ समस्या को पुनर्जीवित करने का मेरा प्रयास इस मुद्दे को फिर से नहीं बनाता है। बहुत धन्यवाद। – UberMongoose

+0

भविष्य से अद्यतन: C++ 11 में इसे संभालने का एक बेहतर तरीका है: http://stackoverflow.com/questions/9458741/with-explicitly-deleted-member-functions-in-c11-is-it-still -worthwhile-टू-INH – Tim