Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用初始值设定项列表初始化派生类的对象_C++_C++11_Initialization_Initializer List - Fatal编程技术网

C++ 使用初始值设定项列表初始化派生类的对象

C++ 使用初始值设定项列表初始化派生类的对象,c++,c++11,initialization,initializer-list,C++,C++11,Initialization,Initializer List,我得到了一个结构B,它是从结构a派生的 struct A{ int a; }; struct B : public A{ int b; }; 有没有一种直接的方法来初始化B类型的对象而不提供构造函数,比如说使用初始值设定项列表 还有一些见解: 我得到了两个structs,用于在线程之间传递数据;第二个存储的数据与第一个存储的数据相同,只是添加了一些同步变量。我可以使第一个struct成为第二个struct的数据成员,或者只是复制第二个struct中的数据成员声明,以便轻松使用

我得到了一个
结构B
,它是从
结构a
派生的

struct A{
  int a;  
};

struct B : public A{
    int b;
};
有没有一种直接的方法来初始化
B
类型的对象而不提供构造函数,比如说使用初始值设定项列表

还有一些见解:


我得到了两个
struct
s,用于在线程之间传递数据;第二个存储的数据与第一个存储的数据相同,只是添加了一些同步变量。我可以使第一个
struct
成为第二个
struct
的数据成员,或者只是复制第二个
struct
中的数据成员声明,以便轻松使用初始值设定项列表;但是我认为在这个特定的应用程序中,第二个
结构扩展第一个结构在逻辑上更为正确。

您不能对
B
使用聚合初始化,因为它不是聚合,根据[dcl.init.aggr]/1:

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

更新:Kerrek SB使用模板构造函数提供了一个很好的解决方案,但如果您愿意,可以为
B
添加非常简单的非模板构造函数:

struct B : public A{
    int b;
    B(const A& a_, int b_) : A(a_), b(b_) {}
};
并与一对额外的支架一起使用:

B b {{3}, 5};

没有一个非常简洁的解决方案,但至少有一个解决方案:

#include <type_traits>
#include <utility>

struct B : A
{
    int b;

    template <typename ...Args,
              typename = typename std::enable_if<
                             std::is_constructible<A, Args&&...>::value>
    B(int x, Args &&... args)
    : b(x), A(std::forward<Args>(args)...)
    { }
};
#包括
#包括
结构B:A
{
int b;
模板