typedef struct {
int x;
int y;
} Test;
int main() {
// This doesn't compile with Apple Clang
Test test1 = Test(10, 5);
// But anyway I can do this
Test test2 = { .x = 10, .y = 5 };
// But this also doesn't compile with Apple Clang
Test *test3 = new Test(10, 5);
return 0;
}
此代码适用于我使用 G++ 13.2.0 的 Ubuntu。
尝试在使用 Apple Clang 15.0.0 的 Mac 上编译它,出现此错误:
没有匹配的构造函数来初始化“Test”
候选构造函数(隐式复制构造函数)不可行:需要 1 个参数
候选构造函数(隐式移动构造函数)不可行:需要 1 个参数
候选构造函数(隐式默认构造函数)不可行:需要 0 个参数
我认为 G++ 会为结构生成一个默认构造函数,该构造函数采用与结构具有的属性一样多的参数,但 Apple Clang 没有?为什么不标准呢?是否有一种“一行”方式在堆上分配并初始化我的结构?我应该怎样做才能使我的代码更可移植?
带括号的聚合初始化是 C++20 的一项功能。您需要启用 C++20 才能工作,并拥有足够新的编译器来支持它。 (这在 Clang 中实现得相对较晚。不幸的是 Apple 使用的版本控制与上游版本控制不匹配,因此很难判断您的版本是否支持它。)
您可以在早期的 C++ 版本中使用带大括号的聚合初始化:
Test test1 = Test{10, 5};
Test *test3 = new Test{10, 5};
使用指定初始化器 (
Test test2 = { .x = 10, .y = 5 };
) 进行聚合初始化也是 C++20 的一项功能,但 Clang 在此之前已经支持它作为 GNU 扩展(当未在严格标准一致模式下编译时)。
此外,作为旁注,这些都与 默认构造函数 没有任何关系。 默认构造函数是可以在没有任何参数的情况下调用的构造函数。你在这里给出两个论点。