gpt4 book ai didi

c++ - P1008 ("prohibit aggregates with user-declared constructors") 在实践中何时有用?

转载 作者:行者123 更新时间:2023-12-03 12:00:50 25 4
gpt4 key购买 nike

P1008 ("Prohibit aggregates with user-declared constructors")已成为 C++20 标准的一部分,以防止在使用聚合初始化时出现意外行为:

struct X {
int i{42};
X() = delete;
};

int main() {
X x2{3}; // Compiles in C++17, error in C++20
}

我同意以上 X x2{3};语句不应该编译。然而,我遇到的所有证明 P1008 的例子根本不现实——它们纯粹是句法,基本上没有意义 foo/ bar/ baz代码片段。

P1008解决了什么问题 在实践中 ?我很难想象我最终会如何写出上面的 X在一个真实的程序中。

在 C++17 聚合中删除默认构造函数而不提供其他构造函数来初始化它对我来说似乎是不现实的。

最佳答案

最明显的情况是这样的:

struct X
{
private:
X() = default;
};

X x{};

这不是应该能够在私有(private)可访问上下文之外初始化的类型。但它可以。

现在,这些类型可能看起来很傻,但它们实际上对于实现通过转发函数工作的私有(private)函数很有用。 make_shared例如不能调用声明的构造函数 private ,即使您制作 make_shared模板 friend 。因此,您可以创建构造函数 public ,但要求用户传递一个类型的实例,该实例只能由具有 private 的人构造使用权。所以 X可以是目标类的成员类型或 X将使目标类成为 friend .

关于c++ - P1008 ("prohibit aggregates with user-declared constructors") 在实践中何时有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840780/

25 4 0