gpt4 book ai didi

c++ - 是否可以防止遗漏聚合初始化成员?

转载 作者:行者123 更新时间:2023-12-01 08:28:40 28 4
gpt4 key购买 nike

我有一个包含许多相同类型成员的结构,就像这样

struct VariablePointers {
VariablePtr active;
VariablePtr wasactive;
VariablePtr filename;
};

问题是,如果我忘记初始化结构成员之一(例如 wasactive ),如下所示:
VariablePointers{activePtr, filename}

编译器不会提示它,但我会有一个部分初始化的对象。我怎样才能防止这种错误?我可以添加一个构造函数,但它会重复两次变量列表,所以我必须输入所有这些三次!

也请加 C++11 答案,如果有 C++11 的解决方案(目前我仅限于该版本)。不过,也欢迎使用最新的语言标准!

最佳答案

如果缺少所需的初始化程序,这是一个触发链接器错误的技巧:

struct init_required_t {
template <class T>
operator T() const; // Left undefined
} static const init_required;

用法:
struct Foo {
int bar = init_required;
};

int main() {
Foo f;
}

结果:
/tmp/ccxwN7Pn.o: In function `Foo::Foo()':
prog.cc:(.text._ZN3FooC2Ev[_ZN3FooC5Ev]+0x12): undefined reference to `init_required_t::operator int<int>() const'
collect2: error: ld returned 1 exit status

注意事项:
  • 在 C++14 之前,这会阻止 Foo根本就不是一个集合体。
  • 这在技术上依赖于未定义的行为(ODR 违规),但应该适用于任何正常的平台。
  • 关于c++ - 是否可以防止遗漏聚合初始化成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60150749/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com