【问题标题】:Brace Initialize struct with virtual functions用虚函数初始化结构
【发布时间】:2021-06-24 08:26:42
【问题描述】:

Brace initialization

        struct A
        {
            int a;
            int b;
            void foo(){}
        };

        A a{1, 2};

它工作正常。但是如果把 foo 改成虚函数,就不会编译出错了,

错误 C2440“正在初始化”:无法从“初始化程序列表”转换为

我找到this

聚合是没有用户提供的数组或类(第 9 条) 构造函数(12.1),没有私有或受保护的非静态数据成员 (第 11 条),无基类(第 10 条),无虚函数 (10.3)。

但这背后的原因是什么?

【问题讨论】:

  • 我可能完全错了,但我知道你发布的链接中提到的一些东西,比如虚拟方法、私有或受保护的非静态、基类,......可以(或真的 100 % do) 更改内存中对象的布局(添加 vptr、privates 和 protected 可能会被编译器重新排列 - 其中任何一个也会破坏std::is_standard_layout<T>。所以也许这不会允许聚合按预期工作. 用户提供的构造函数是另一回事 - 对我来说这是关于如何在它和聚合 init 之间进行选择。您可以使用 initializer_list 添加一个 ctor

标签: c++ c++11 struct constructor initialization


【解决方案1】:

你为什么不使用带有virtual void foo() {}的参数化构造函数

struct A
{
    int a;
    int b;
    A(int a, int b)
    {
        this->a = a;
        this->b = b;
    }
    virtual void foo() {}
};
A a{ 1, 2 }; 

【讨论】:

  • 这个构造函数的想法还不错,但我更喜欢:A(int a, int b): a(a), b(b) { },即更喜欢初始化器而不是赋值(尽管它可能不会对ints 产生影响)。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 2021-03-17
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多