如果 C++11 中存在 `std::initializer_list` ctor,如何使用默认成员初始值设定项?

问题描述 投票:0回答:1

考虑以下代码:

#include <iostream>

struct A {
    A(int, int) {
        std::cout << "A::A(int, int)\n";
    }

    A(std::initializer_list<int>) {
        std::cout << "A::A(std::initializer_list<int>)\n";
    }
};

struct B {
    A a(1, 2); // compiler error
};

struct C {
    A a{1, 2}; // always call A::A(std::initializer_list<int>)
};

struct D {
    A a{A(1, 2)}; // always call A::A(int, int), how UgLy it is!
};

int main() {
    new B{};
    new C{};
    new D{};
}

还有比

A a{A(1, 2)};
更好的解决方案吗?

c++ c++11 initializer-list list-initialization most-vexing-parse
1个回答
0
投票

成员的默认成员初始值设定项应该是大括号或等于初始值设定项。 (不能使用括号,因为在某些情况下它可能与函数声明语法冲突。)

因此,可以通过以下两种方式之一来初始化成员:

  1. 使用相等初始化器:

    struct B {
       A a = A(1, 2);
    };
    
  2. 在构造函数中使用成员初始值设定项列表:

    struct B {
       A a;
       B(): a(1, 2) {}
    };
    
© www.soinside.com 2019 - 2024. All rights reserved.