gpt4 book ai didi

c++ - 使用带有 clang 的初始化列表初始化简单结构

转载 作者:行者123 更新时间:2023-11-30 04:27:27 25 4
gpt4 key购买 nike

struct E_Point {
double x, y;
E_Point(): x(0), y(0) {}
E_Point(double x, double y) : x(x), y(y) {}
};

E_Point problem[] = {
{0.3871953044519425, -0.91857980824611341}, // Error: initialization of non-aggregate type 'E_Point' with an initializer list
{0.36139704793723609, 0.91605957361605106},
{-0.8208980020500205, 0.52853407296583088},
{0.36178501611208552, 0.88880385168617226},
{-0.43211245441046209, 0.6803420222771047}
};

使用 clang 编译 3.1。

我应该指出,这是在 GCC 4.6.1 上编译的。

我目前的理解是,problem 是一种非聚合类型,因为它是一个结构数组,使其复合,而不仅仅是一个结构或数组。

但是将 -std=c++11 标志发送到 clang 并不能缓解问题。

更新:好的。看起来我的 clang 版本存在某种缺陷,无论出于何种原因都无法处理。

什么是更传统的初始化方法?我这样做吗?这会编译,但它会产生相同的代码吗?它会在原件不调用时调用 ctor 吗?

E_Point problem[] = {
E_Point(0.3871953044519425, -0.91857980824611341), // 1559
E_Point(0.36139704793723609, 0.91605957361605106), // 1560
E_Point(-0.8208980020500205, 0.52853407296583088), // 1798
E_Point(0.36178501611208552, 0.88880385168617226), // 1799
E_Point(-0.43211245441046209, 0.6803420222771047) // 1800
};

最佳答案

这是 clang++ 中的一个错误:

http://llvm.org/bugs/show_bug.cgi?id=12670

在您的情况下,您可以只使用对构造函数的显式调用,正如您在最后一个代码片段中提供的那样。至于语义是否真的相同(会不会生成相同的代码),在大多数情况下是会的。

不同的语法会导致不同的行为的情况是,正在构造的类型具有一个采用 std::initializer_list<> 的构造函数。 , 在这种情况下 brace-initializer 将构造该初始化列表。如果类型没有这样的构造函数(如您的情况),大括号初始化器 将调用适当的构造函数。

关于c++ - 使用带有 clang 的初始化列表初始化简单结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10907574/

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