Сообщение Инициализация через прокси структуру без initializer_list и от 15.11.2018 22:30
Изменено 15.11.2018 22:33 Marty
Компилятор С++ 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 очень не хочу разрешать копировать. Есть идеи?
Компилятор С++ 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 очень не хочу разрешать копировать. Есть идеи?
ЗЫ Может смотреть в сторону конструктора перемещения, благо он вроде компилятором поддерживается?