我正在尝试为一些元数据建模,以对C++对象进行序列化/反序列化。这是捕捉我所需要的基本要素的东西。它使用GCC 5.2(g++ sample.cpp -std=c++14)和Clang 3.6(clang++ sample.cpp -std=c++14)进行编译。

我的问题是关于示例中的struct TypeInfo的。它包含自身的std::initializer_list。这符合标准吗?

#include <cstdint>
#include <initializer_list>

enum class TypeCode : std::uint8_t { BOOLEAN, INT, OBJECT, STRING, SENTINEL };

struct TypeInfo
{
    TypeCode typeCode_;

    char fieldName_[64];

    union
    {
        std::uint16_t textMinLength_;
        std::uint16_t objectVersionMajor_;
    };

    union
    {
        std::uint16_t textMaxLength_;
        std::uint16_t objectVersionMinor_;
    };

    //  set only if typeCode_ = OBJECT
    std::initializer_list < TypeInfo > objectTypeInfos_;
};

int main()
{
    TypeInfo const sti { TypeCode::STRING, "updatedBy", { .textMinLength_ = 0 }, { .textMaxLength_ = 16 } };

    TypeInfo const iti { TypeCode::INT, "amount", { 0 }, { 0 } };

    TypeInfo const oti { TypeCode::OBJECT, "startTime", { .objectVersionMajor_ = 1 }, { .objectVersionMinor_ = 0 }, {
      TypeInfo { TypeCode::INT, "weekdays", { 0 }, { 0 } },
      TypeInfo { TypeCode::INT, "timeOfDay", { 0 }, { 0 } },
      TypeInfo { TypeCode::STRING, "timezone", { .textMinLength_ = 0 }, { .textMaxLength_ = 5 } }
    } };

    TypeInfo const noti { TypeCode::OBJECT, "schedule", { .objectVersionMajor_ = 1 }, { .objectVersionMinor_ = 0 }, {
      TypeInfo { TypeCode::INT, "id", { 0 }, { 0 } },
      TypeInfo { TypeCode::STRING, "description", { .textMinLength_ = 0 }, { .textMaxLength_ = 16 } },
      TypeInfo { TypeCode::OBJECT, "startTime", { .objectVersionMajor_ = 1 }, { .objectVersionMinor_ = 0 }, {
        TypeInfo { TypeCode::INT, "weekdays", { 0 }, { 0 } },
        TypeInfo { TypeCode::INT, "timeOfDay", { 0 }, { 0 } },
        TypeInfo { TypeCode::STRING, "timezone", { .textMinLength_ = 0 }, { .textMaxLength_ = 5 } }
      } }
    } };
}

最佳答案

实际上,使用当前的措词会导致未定义的行为。在std::initializer_list<TypeInfo>实例化时,TypeInfo不完整,因此[res.on.functions]/(2.5)适用:



…尚未针对initializer_list特别指定不完整​​的类型-但是,这显然是有缺陷的。 LWG issue 2493选择解决此问题:



IE。您的代码是正确的(在解决了上述DR后,正式上也可以)。

关于c++ - 类型和initializer_list不完整,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34659923/

10-13 09:47