问题标签 [list-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.
c++ - 为什么 ={} 初始化不适用于元组?
对我来说 apair
只是 a 的特例tuple
,但以下让我感到惊讶:
为什么我们使用{}
初始化时会有所不同tuple
?
我什至试过g++ -std=c++1y
但仍然有错误:
c++ - 在 C++ 中初始化变量的正确方法是什么
我有以下代码:
和
其中 a 和 b 是一些相同类型的变量。
我想知道,以上两种初始化有什么区别,在什么情况下应该首选哪一种?任何形式的帮助将不胜感激。
c++ - 多维大括号括起来的初始化列表到多向量
我想要的是通过大括号封闭的初始化列表生成 5x5 矩阵的可能性。这样它以后可能看起来像:
为此,我现在有我的 Matrix5T 类,目前仅适用于向量:
所以我可以做到以下几点:
目前,我没有找到解决方案,让我的类中的多维向量由多维大括号括起来的初始化列表初始化。
我尝试了以下示例,这会导致错误:
错误是说从初始化列表到多维向量的转换不起作用:
那么我该如何解决这个问题呢?
c++ - 没有任何值的大括号初始化
写这样的东西可以吗
这个变量会在这个表达式之后包含 0 吗?
c++ - 当参数是初始值设定项列表并且参数是引用时的重载解决方案
我问了一个问题,gcc 和 clang 和 @Johannes Schaub 之间的重载解析得到了不同的结果- litb 解释了有效的规则。但是我对13.3.3.1.4 Reference binding仍有一些疑问。
N4527 13.3.3.1.5 [over.ics.list] p1 和 p8
1 当参数是初始值设定项列表 (8.5.4) 时,它不是表达式,并且应用特殊规则将其转换为参数类型。
8 否则,如果参数是参考,请参见 13.3.3.1.4。
13.3.3.1.4 [over.ics.ref] p1 和 p2
1 当引用类型的参数直接(8.5.3)绑定到参数表达式时,隐式转换序列是恒等转换,除非参数表达式的类型是参数类型的派生类,在这种情况下,隐式转换序列是派生到基础的转换 (13.3.3.1)。[ 例子... ]
如果参数直接绑定到将转换函数应用于参数表达式的结果,则隐式转换序列是用户定义的转换序列 (13.3.3.1.2),第二个标准转换序列是恒等转换,或者,如果转换函数返回一个类型的实体,该类型是参数类型的派生类,即派生到基转换。
2 当引用类型的参数不直接绑定到参数表达式时,转换顺序是根据 13.3.3.1 将参数表达式转换为引用的基础类型所需的顺序。从概念上讲,此转换序列对应于使用参数表达式复制初始化基础类型的临时变量。顶级 cv 限定的任何差异都包含在初始化本身中,并且不构成转换。
问题1:“参数表达式”是否包括“初始化列表”?请参阅上面的 13.3.3.1.5 [over.ics.list] p1 粗体短语和
1.3.2 [defns.argument]
争论
<function call expression> 括号内的逗号分隔列表中的表达式 (5.2.2)
8.5 [dcl.init] p17
17 初始化器的语义如下。目标类型是正在初始化的对象或引用的类型,源类型是初始化表达式的类型。如果初始化器不是单个(可能是带括号的)表达式,则未定义源类型。
(17.1) — 如果初始值设定项是(无括号的)大括号初始化列表,则对象或引用是列表初始化的 (8.5.4)。
(17.2) — 如果目标类型是引用类型,见 8.5.3。
8.5.3 [dcl.init.ref] p5
对“cv1 T1”类型的引用由“cv2 T2”类型的表达式初始化,如下所示:
[...]
(5.2.2.2) — 否则,将创建一个“cv1 T1”类型的临时变量,并从初始化表达式中复制初始化 (8.5)。然后将引用绑定到临时文件。
[...]
在除最后一种情况之外的所有情况下(即,从初始化表达式创建和初始化一个临时变量),引用被称为直接绑定到初始化表达式。
问题2:“直接绑定”是否包括初始化程序是初始化程序列表的情况?换句话说,当初始化器是初始化器列表时,我们可以使用“直接绑定”吗?
注意:“直接绑定”是 8.5.3 中的定义,由 8.5 p17.1 引用,“初始化程序是一个花括号初始化列表”是 8.5.4 中的定义,由 8.5 p17.2 引用
问题3(主要问题):
当参数是初始化列表并且参数是引用时,13.3.3.1.5 [over.ics.list] p8 引用 13.3.3.1.4 [over.ics.ref],但我看不到任何单词关于参数,它是一个初始化列表。我认为“直接绑定”和“参数”的定义与“初始化列表”无关。
你能解释一下当参数是初始化列表并且参数是引用时重载解析是如何工作的吗?
注意:这三个问题是相关的。当您回答第三个问题时,您将回答第一个和第二个问题。
c++ - 为什么这个变量在 C++14 中的 g++ 中没有被推断为 initializer_list?
考虑以下程序:
-std=c++14
即使我使用选项,它也可以在 ideone 上正常编译。在此处查看现场演示。但在 C++14 中,变量i
应该initializer_list
根据this推导出来。
有一个针对 C++1z 的提议,它为大括号初始化实现了新的类型推导规则:
对于直接列表初始化:
对于只有一个元素的花括号初始化列表,自动推导将从该条目中推导出;
对于具有多个元素的支撑初始化列表,自动推导将是不正确的。
[例子:
自动 x1 = { 1, 2 }; // decltype(x1) 是 std::initializer_list
自动 x2 = { 1, 2.0 }; // 错误:无法推断元素类型
自动 x3{ 1, 2 }; // 错误:不是单个元素
自动 x4 = { 3 }; // decltype(x4) 是 std::initializer_list
自动 x5{ 3 }; // decltype(x5) 是 int。
--结束示例]
因此,规则在 C++17 中发生了变化。因此,当我使用-std=c++14
. 这是g ++中的错误吗?不应该像C++14 中i
那样推导出变量吗?initializer_list
c++ - int a[] { (functioncall(a1, a2), 0)...}; (无效(a));这个语法是做什么/意味着什么?
我遇到了这个 post variadic template function to concatenate std::vector 容器,建议使用以下语法:
我开始玩弄它以了解它是如何工作的,因为我还没有看到这个:
似乎这是某种动态生成的初始化列表,也有副作用?我也对0
以上无关紧要的事实感到困惑。我替换了 -1 和 5,这些值中的每一个也都工作得很好。
那么有人可以告诉我这种技术/语法的名称以及上面两行中到底发生了什么吗?如果我错过了相关的 SO 帖子,我将非常感谢任何指点并道歉。