问题标签 [aggregate-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1176 浏览

c++ - 在函数调用时从异构初始化列表构建元组

考虑以下函数

在 C++17 中是否有任何方法可以修改函数签名,以便标记为“失败”的行可以工作?(保持该行相同)。

0 投票
2 回答
771 浏览

c++ - 列表初始化函数参数的默认值

谁能帮我解决以下问题?

有一个简单的代码:

当我尝试通过 gcc 5.4.0 编译它时,出现错误:

令人惊讶的是,但是 clang 编译得很好。另外,如果稍微修改一下代码,它的编译不会有任何问题:

我真的不明白第一个代码有什么问题。

0 投票
1 回答
82 浏览

c - 给定一个指向结构的指针,我可以在一行中为该结构分配聚合初始化器的结果吗?

例如,给定一个结构 S:

...和一个带有指向 的指针的方法,我可以在一行中将S聚合初始化程序1的值全部分配给它吗?这是我现有的使用临时解决方案:

我正在使用 C11。


1对于非常罕见的不理解我的问题的超级学徒,因为不知何故“聚合初始化器”在这里不适用,因为 LHS 没有声明一个新对象,我的意思是“带有大括号和东西的类似聚合初始化器的语法”。

0 投票
3 回答
636 浏览

c++ - 我可以避免为 std::variant 中的每个结构显式编写构造函数吗?

考虑这段代码:

这不会编译,{}从行中删除时也不会编译/*1*/,即使聚合初始化也是如此

以“类似构造函数”的形式工作。我能否以某种方式使std::variant初始化程序意识到使用聚合初始化构造结构的可能性,而不必为可能在我的实际案例中使用的每个结构编写无聊的样板构造函数?

我希望这能以某种方式工作,根据cppreference有问题的两个重载 (5) 和 (6) 都说

构造具有指定替代 T 的变体并使用参数初始化包含的值[...]

如果这很重要,我正在使用 GCC 7。

0 投票
0 回答
102 浏览

c++ - 可变参数函数调用中的强制大括号省略

我有两个 POD

和一个可变参数函数,它使用(我认为是)聚合就地分配 POD

remake模板在用于结构 A 时按预期工作

但是在没有大括号省略的情况下用于 B 时会出错:No instance of template function 'remake' matches argument list. Argument types are: (B*, {...}, int)

并在与 B 一起使用时使用(我认为是)大括号省略

我觉得我调用 remake(B*, ...) 的第一种形式通过明确显示嵌套结构正在获取其数据但在其当前形式中不可用的位置,意图更加清晰。真的,我觉得这个错误可能是可变参数模板和初始化列表之间微妙交互的结果(以及缺乏对它们的理解)。或者我完全错过的完全不同的东西。

我想在第一个 remake(B*, ...) 形式中完成的工作可能吗?如果是这样,我做错了什么导致它无法按预期工作?


加法:目的

我想要这种模式的应用程序是一个内存重用同构数据结构,它为这些 POD 保存预分配的数组。外部对象可以请求创建 POD,提供结构值,此时数据结构找到未使用的数组位置并用这些值填充它。所以 remake 看起来像T* create(Args&&... args)(容器是指针稳定的)

0 投票
1 回答
909 浏览

c++ - 聚合初始化不支持构造函数访问

鉴于下面的示例,我惊讶地发现,尽管默认构造函数被显式删除(或为此设为默认),聚合初始化仍然是可能的。

标准中是否未指定私有默认(或已删除)构造和聚合初始化之间的关系?

GCC 6.3 和 VCC 2017 都是这种情况

我问这个问题的原因是,我希望更改对默认构造函数的访问会阻止公共聚合初始化

0 投票
1 回答
694 浏览

c++ - 我应该担心 C++17 中的 Wmissing-field-initializers 和聚合初始化吗?

我用 GCC 编译了一些代码-Wall-Wextra启用。此代码产生警告:

我应该为此担心吗?这是 GCC 中用于输出此警告的错误吗?似乎我没有要初始化的字段,也没有缺少参数。

0 投票
1 回答
146 浏览

c++ - c++17中的聚合初始化可以执行复制省略吗?

鉴于:

可以直接初始化Foo::i而不是复制到它们中,并解释为什么可以/不能使用 C++17 标准(可能是一些用于测试目的的代码)? Foo::str1std::string(...)

如果不能,需要多少份?

0 投票
1 回答
758 浏览

c++ - 标准库中聚合可初始化性的类型特征?

C++ 标准库必须std::is_constructible<Class, T...>检查是否可以从给定类型作为参数构造类。

例如,如果我有一个MyClass具有构造函数的类MyClass(int, char),那么std::is_constructible<MyClass, int, char>::value将是true.

是否有类似的标准库类型特征将检查聚合初始化是否有效,即格式正确MyClass{int, char}并返回MyClass?

我的用例:

我想编写一个函数模板,std::tuple使用聚合初始化将 a 转换为(通常是 POD)类,具有以下签名:

为了防止用户使用无效的这个函数Class,我可以在这个函数内部写一个static_assert来检查给定的tp参数是否具有可转换为成员的类型Class。似乎一种类型特征is_aggregate_initializable<Class, T...>会派上用场。

我可以推出我自己的这个特性的实现,但只是为了提供信息,标准库中是否有我忽略的这样一个特性,或者很快就会成为标准库的一部分?

0 投票
2 回答
1642 浏览

c++ - C++17 模板类初始化的折叠表达式的限制类型

我基本上尝试编写自己的游戏引擎供练习和个人使用(我知道,这几乎是一项不可能完成的任务,但正如我所说,它主要用于学习新事物)。

目前,我正在研究我的数学库(主要是向量和矩阵),我遇到了一个有趣但主要是美学问题。

给出以下伪代码:

现在我希望能够以所需的浮点数作为参数来构造结构:

由于数组的大小是由模板参数给出的,所以我很难为结构声明一个合适的构造函数。我的最终目标是这样的:

当然,这是非逻辑语法,但我以这种方式实现的最接近的事情是使用C++17 折叠表达式

它在填充数组的意义上工作得非常好,而且(我猜)开销不大,但对于使用这个结构的程序员来说,它也容易出错,因为它没有直接指示构造函数接受了多少参数。

此外,它没有指定应该是哪种类型的参数,这是我最大的问题。

如果它有效,为什么会有问题?

想象一下使用 TVector 结构的以下结构:

鉴于构造函数类似于向量结构的折叠表达式,我希望能够使用相应大小的向量或大括号初始化来构造矩阵。

  1. 聚合初始化不起作用。

    /li>
  2. 当给定错误的参数(例如大小错误的向量,不适合作为矩阵的列)时,它在编译之前不会显示错误。

  3. 错误的来源并不总是很清楚。

TL; DR:现在终于到了我真正的问题:

有没有办法限制折叠表达式的类型,最终根本不使用模板并解决我上面给出的 3 个问题?

我想像:

和:

当然,我在这里很挑剔,这主要是一个审美问题,但我认为这是一个重要的设计决策,它可以真正提高代码的可用性。


感谢您阅读本文并帮助我解决我的第一个问题 :)