Информация об изменениях

Сообщение Инициализация через прокси структуру без initializer_list и от 15.11.2018 22:30

Изменено 15.11.2018 22:33 Marty

Инициализация через прокси структуру без initializer_list и тп
Здравствуйте!

Компилятор С++ 11, но без библиотек 11ого стандарта. Keil, мать его.

// SPL sim

struct RawDeviceStruct
{
    unsigned reg1;
    
}; // struct RawDeviceStruct

typedef RawDeviceStruct* RawDevice;

RawDevice DEV1 = (RawDevice)0x01;

// End of SPL sim
    
struct DeviceConfig
{
    RawDevice       device;
      unsigned        pin;
};

class Device
{
    private:
    Device(); // = delete
    Device( const Device &d ); // = delete
        
    
public:
    
    //Device() = delete;
    //Device( const Device &d ) = delete;

    // Err2
    Device( RawDevice d, unsigned p )
            : m_cfg()
        {
            m_cfg.device = d;
            m_cfg.pin    = p;
        }

    Device( const DeviceConfig &cfg )
            : m_cfg(cfg)
        {}
            
      void operator=( const DeviceConfig &cfg )
        {
            m_cfg = cfg;
        }
            
            

    
protected:
      DeviceConfig  m_cfg;

}; // class Device




int main()
{
    static volatile Device device1( { DEV1, 4 } );        
        static volatile Device device2 = { DEV1, 4 }; // Err1
}


Если закоментировать конструктор Err2, то получаю:

structs.cpp(66): error: #289: no instance of constructor "Device::Device" matches the argument list
argument types are: (RawDevice, int)
static volatile Device device2 = { DEV1, 4 }; // Err1


Если конструктор Err2 не закоментирован, то получаю:

structs.cpp(65): error: #309: more than one instance of constructor "Device::Device" matches the argument list:
function "Device::Device(const Device &)"
function "Device::Device(const DeviceConfig &)"
argument types are: ({...})
static volatile Device device1( { DEV1, 4 } );



Класс Device очень не хочу разрешать копировать. Есть идеи?
Инициализация через прокси структуру без initializer_list и
Здравствуйте!

Компилятор С++ 11, но без библиотек 11ого стандарта. Keil, мать его.

// SPL sim

struct RawDeviceStruct
{
    unsigned reg1;
    
}; // struct RawDeviceStruct

typedef RawDeviceStruct* RawDevice;

RawDevice DEV1 = (RawDevice)0x01;

// End of SPL sim
    
struct DeviceConfig
{
    RawDevice       device;
      unsigned        pin;
};

class Device
{
    private:
    Device(); // = delete
    Device( const Device &d ); // = delete
        
    
public:
    
    //Device() = delete;
    //Device( const Device &d ) = delete;

    // Err2
    Device( RawDevice d, unsigned p )
            : m_cfg()
        {
            m_cfg.device = d;
            m_cfg.pin    = p;
        }

    Device( const DeviceConfig &cfg )
            : m_cfg(cfg)
        {}
            
      void operator=( const DeviceConfig &cfg )
        {
            m_cfg = cfg;
        }
            
            

    
protected:
      DeviceConfig  m_cfg;

}; // class Device




int main()
{
    static volatile Device device1( { DEV1, 4 } );        
        static volatile Device device2 = { DEV1, 4 }; // Err1
}


Если закоментировать конструктор Err2, то получаю:

structs.cpp(66): error: #289: no instance of constructor "Device::Device" matches the argument list
argument types are: (RawDevice, int)
static volatile Device device2 = { DEV1, 4 }; // Err1


Если конструктор Err2 не закоментирован, то получаю:

structs.cpp(65): error: #309: more than one instance of constructor "Device::Device" matches the argument list:
function "Device::Device(const Device &)"
function "Device::Device(const DeviceConfig &)"
argument types are: ({...})
static volatile Device device1( { DEV1, 4 } );



Класс Device очень не хочу разрешать копировать. Есть идеи?

ЗЫ Может смотреть в сторону конструктора перемещения, благо он вроде компилятором поддерживается?