Я должен следующий код:
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 ++? Я делаю что-то неправильно? Или это возможно ошибка компилятора?
Это ошибка в 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.
Ваш класс соответствует всем критериям. лязг а также НКУ также примите ваш источник, чтобы я был удивлен, если бы я что-то упустил.