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

标签 c++ aggregate-initialization

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

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/

    相关文章:

    c++17 聚合初始化

    c++ - 用于聚合结构初始化时的三元运算符整数表达式的类型

    c++ - c中的伪随机函数?

    c++ - 如何将 MQseries 原因代码转换为字符串?

    c++ - 缺少用户定义的构造函数是否违反了非默认可构造结构的标准?

    c++ - 使用声明中的元素类型隐式初始化 std::array

    c++ - 使用 map 查找具有给定总和(带负数)的子数组

    c++ - 为什么这个初始化本身不会产生编译器警告?

    c++ - 为什么 C 或 C++ 标准不明确将 char 定义为有符号或无符号?