gpt4 book ai didi

c++ - 为什么我不能将指定的初始化程序与不是聚合的结构一起使用?

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

C++ 有一个不错的新特性:

struct Point{
int x;
int y;
int z;
};

Point p{.x=47, .y=1701, .z=0};
但是,如果我添加一个构造函数,那么我将被禁止使用 nice 指定的 initalizers 语法:
struct Point{
Point(int x, int y, int z = 0): x(x), y(y), z(z){}
int x;
int y;
int z;
};

static Point p{.x=47, .y=1701, .z = 0};

error: designated initializers cannot be used with a non-aggregatetype 'Point'


我是否遗漏了一些明显的东西(为什么如果指定的初始化器与具有公共(public)成员但不是聚合的结构/类一起使用会很糟糕)或者这只是一个没有添加到标准中的缺失功能?

最佳答案

聚合初始化(包括使用设计的初始化程序进行初始化)绕过类的构造函数。
这对聚合来说不是问题,因为它们不允许有用户定义的构造函数。但是,如果您允许对具有用户提供的构造函数(做一些有用的事情)的类进行这种初始化,它可能是有害的。
考虑这个例子:

class A
{
static std::map<A *, int> &Indices()
{
static std::map<A *, int> ret;
return ret;
}

public:
int dummy = 0;

A(int index)
{
Indices().emplace(this, index);
}

A(const A &) = delete;
A &operator=(const A &) = delete;

~A()
{
auto it = Indices().find(this);
std::cout << "Deleting #" << it->second << '\n';
Indices().erase(it);
}
};
如果你能做到 A{.dummy = 42}; ,你会在析构函数中得到 UB,并且无法防止这种用法。

关于c++ - 为什么我不能将指定的初始化程序与不是聚合的结构一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64770166/

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