Apple Clang 结构的默认构造函数

问题描述 投票:0回答:1
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++ g++ clang apple-clang
1个回答
0
投票

带括号的聚合初始化是 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 扩展(当未在严格标准一致模式下编译时)。


此外,作为旁注,这些都与 默认构造函数 没有任何关系。 默认构造函数是可以在没有任何参数的情况下调用的构造函数。你在这里给出两个论点。

© www.soinside.com 2019 - 2024. All rights reserved.