2012-12-05 17 views
8

Boost :: asio kullanan aşağıdaki kodları kullanın. İki etiketlenmiş satırları yorum yaparsanızGarip C4512 uyarısı. Niye ya?

#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 
    {  
    } 
}; 

derleyici (Visual Studio 2010)/W4 üzerinde derleme aşağıdaki uyarıyı verir.

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

Bu iki satırı bu kadar özel yapan nedir? Neden varoluşları atama operatörünün oluşturulmasına izin veriyor?

cevap

7

Bu davranışın nedeni, tcp::acceptor'un kopyalanamaz olmasıdır (kopya atama işleci özel olan basic_io_object öğesinden devraldığı için kendi kopya atama işleci örtülü olarak bildirilmemiştir). Devredilemez bir üyeye sahip olmak, örtülü olarak kopyalanan kopya atama işlecinin oluşturulmasını engeller, ancak bu, beklenen davranış olarak kabul edildiğinden bir uyarı vermez.

Diğer yandan, bu iki satırı yorumladıysanız, sınıfınız yalnızca bir referans üyeyle bırakılır; Bu aynı zamanda sınıfınızı kopmaz hale getirir, ancak Visual Studio belgelerine göre bir uyarı verir. Bunun da beklendiğine katılıyorum, ancak derleyici uygulayıcıları her ihtimale karşı size bir uyarı vermeye karar verdiler. Bunun nedeni, bir sınıfı açıkça kopyalanamaz hale getirmenin (basic_io_object ile olduğu gibi) açık bir tasarım kararı vermesi olabilir, ancak ben sadece burada tahmin ediyorum.

+0

Ah, evet. Doğru görünüyorsun. Boost devralınamaz: noncopyable uyarıyı çözdü. Ayrıca, soruyu bir atomik tür (int ve int) ile yeniden oluşturma girişimin neden yeniden oluşturulamadığını açıklıyor. Çok teşekkürler. – UberMongoose

+0

Gelecekten itibaren güncelleştirme: C++ 11'de bununla başa çıkmak için daha iyi bir yol var: http://stackoverflow.com/questions/9458741/with-explicitly-deleted-member-functions-in-c11-is-it-still -worthwhile-için-inh – Tim

İlgili konular