C ++构造函数初始化列表中的C结构副本

C struct copy in C++ constructor initialization list

我的问题出在以下代码上:

extern "C" struct CStruct {
  char a;
  char b;
};

class X {
  CStruct cs;

public:
  X(CStruct cs_arg) : cs{cs_arg} {}
  X(CStruct cs, bool){
    this->cs = cs;
  }

};

Clang 3.4 (c++11) 抱怨第一个构造函数而不是第二个构造函数。

../st2.cpp:10:25: error: no viable conversion from 'CStruct' to 'char'
        X(CStruct cs_arg) : cs{cs_arg} {}
                               ^~~~~~
1 error generated.

如果 cs 成员显然是一个结构,怎么会说转换为 char? 我可以在初始化列表中进行这种初始化工作还是必须在函数体中进行?为什么?

真正的代码使用 class 的模板,如果类型是简单的 POD 结构,它就会失败。它不应该处理任何比 POD 结构更复杂的东西。

您正在使用聚合初始化。

你应该

cs {char1, char2} .

如果你想从另一个结构初始化,你应该使用

cs(cs_arg). 

或者,如果您不想创建复制构造函数,请使用

cs{cs_arg.a, cs_arg.b};

您是否正在尝试初始化 cs?然后代码可以更正为

  X(CStruct cs_arg) : cs(cs_arg) {}             // change cs_arg{cs} to cs(cs_arg)

这里会调用拷贝构造函数