【问题标题】:Aggregate initialization in C++C++ 中的聚合初始化
【发布时间】:2021-07-23 13:36:56
【问题描述】:

我有一个基类 Event,具体事件派生自它:

struct Event
{
};


struct CollisionEvent : Event
{
    //CollisionEvent(Entity entityA, Entity entityB) : entityA(entityA), entityB(entityB) {}

    Entity entityA;
    Entity entityB;
};

这个类是一个 POD,我应该能够执行聚合初始化。但是下面的代码编译失败:

called from application:

eventBus->DispatchEvent<CollisionEvent>(mEntities[i], mEntities[j]);



in EventBus.h:

template <typename TEvent, typename... Args>
    void DispatchEvent(Args&&... args)
    {
        auto it = mEventHandlers.find(typeid(TEvent));

        if (it != mEventHandlers.end())
            for (auto &&eventHandler : it->second)
                eventHandler->Invoke(TEvent{ std::forward<Args>(args)... });
    }

说它不能将初始化列表转换为 TEvent。为什么?

【问题讨论】:

  • 缺少基础Event init。 CollisionEvent {{}, entityA, entityB}.
  • 您使用的是哪个 C++ 标准? C++17 之前的继承不符合聚合条件。
  • @Yksisarvinen C++17
  • @Jarod42 所以我必须显式初始化基础?

标签: c++ initialization aggregate forward


【解决方案1】:

对于聚合初始化,您需要初始化基类,即使它是空的。

eventBus->DispatchEvent<CollisionEvent>(Event{}, mEntities[i], mEntities[j]);

在最近的标准中,关于什么是聚合和什么不是聚合也有一些变化——在 C++17 之前,具有基类的类不能被聚合初始化,所以你不能让它在C++14。 (见https://godbolt.org/z/Pq5PfecKq

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2021-10-23
    • 2020-03-18
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多