constexpr с делегирующими конструкторами

Я должен следующий код:

class IP4Address
{
public:
constexpr IP4Address();
constexpr IP4Address(uint32_t a_IP, uint16_t a_Port);

private:
uint32_t m_IP;
uint16_t m_Port;
};

constexpr IP4Address::IP4Address():
IP4Address(0, 0)
{

}

constexpr IP4Address::IP4Address(uint32_t a_IP, uint16_t a_Port):
m_IP(a_IP),
m_Port(a_Port)
{

}

Что приводит к следующим ошибкам (Visual Studio 2015):

error C2476: 'constexpr' constructor does not initialize all members
note: 'IP4Address::m_IP' was not initialized by the constructor
note: 'IP4Address::m_Port' was not initialized by the constructor

Это недействительный C ++? Я делаю что-то неправильно? Или это возможно ошибка компилятора?

2

Решение

Это ошибка в MSVC 2015. Документация C ++ 11 §7.1.5 4 довольно ясно говорит:

4. Определение конструктора constexpr должно удовлетворять следующим ограничениям:

4,1 класс не должен иметь никаких виртуальных базовых классов

4,2 каждый из типов параметров должен быть литеральным типом

4,3 его тело-функция не должно быть блоком-функцией-попыткой;

Кроме того, либо его тело функции должно быть = delete, либо оно должно удовлетворять следующим ограничениям:

4,4 либо его тело функции должно быть = default, либо составной оператор его тела функции должен удовлетворять ограничениям для тела функции функции constexpr;

4.5 каждый не вариантный нестатический член данных и подобъект базового класса должны быть инициализированы

4,6 если класс является объединением, имеющим вариантные члены (9.5), то точно один из них должен быть инициализирован;

4,7 если класс является объединяющим классом, но не является объединением, для каждого из его анонимных членов объединения, имеющих вариантные члены, инициализируется ровно один из них;

4,8 для не делегирующего конструктора каждый конструктор, выбранный для инициализации нестатических членов данных и подобъектов базового класса, должен быть
конструктор constexpr;

4,9 для делегирующего конструктора целевой конструктор должен быть конструктором constexpr.

Ваш класс соответствует всем критериям. лязг а также НКУ также примите ваш источник, чтобы я был удивлен, если бы я что-то упустил.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru