POD can have private/protected members
由于 protected 成员,不可能像这样初始化结构:
struct SomePOD_t {
protected:
char *p_begin;
char *p_end;
};
void foo() {
const char *STR = "Some data";
SomePOD_t data = { STR, STR + strlen(STR)+1 }; // error "no mathing constructor for
// initialization of SomePOD_t"
}
我的问题是如何更轻松地将 POD 类型传递给函数:
// gonna use this foo
void foo_uses_some_pod(SomePOD_t data);
void foo()
{
const char *STR = "Some data";
//error "no matching function for call to 'foo_uses_some_pod'"
// "candidate function not viable: cannot convert initializer list argument to 'SomePOD_t'"
foo_uses_some_pod({STR, STR + strlen(STR)+1});
//ok, if SomePOD_t::static_built_function is defined.
foo_uses_some_pod(SomePOD_t::static_built_function(STR, STR + strlen(STR)+1));
}
我认为显式类型映射 SomePOD_t{STR, STR + strlen(STR)+1}
在函数调用中是一个很好的做法,但是多余static_built_function
在SomePOD_t::static_built_function(STR, STR + strlen(STR)+1)
太多了。
如果我将构造函数添加到 SomePOD_t
它将不再是 POD,因此所有使用 SomePOD_t
的类型也将成为非 POD,我必须使用 SomePOD_t
为每种类型添加构造函数作为成员,或者使用具有类型 ... ... 的类型,该类型具有 SomePOD_t
作为成员(member)。
类型可以是 POD、具有私有(private)/ protected 成员并支持初始值设定项列表初始化吗?怎么办?
最佳答案
随着时间的推移,情况发生了变化。最近的 C++ 语言规范已弃用“POD”类的概念。现在有一个“聚合”的概念。聚合不能有 protected 或私有(private)成员,也不能有非默认构造函数。 initialization您正在尝试使用可以应用于聚合的初始值设定项列表。
由于您有 protected 成员,因此聚合初始化不适用。如果您想使用初始值设定项列表构造对象,您需要提供一个构造函数来执行此操作。
关于c++ - 如何在不创建构造函数的情况下使用私有(private)/ protected 成员初始化 POD 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057679/