问题标签 [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++11 - 复制列表初始化与临时的直接列表初始化
给定以下结构:
输出:
是:
而输出:
是:
在试图理解两者之间的区别时,我想我已经确定第一种情况是使用复制列表初始化,而第二种情况是使用未命名临时的直接列表初始化(分别为数字 7 和 2,在这里:http ://en.cppreference.com/w/cpp/language/list_initialization )。
搜索类似的问题我发现了这个:为什么标准区分直接列表初始化和复制列表初始化?还有这个:复制列表初始化是否在概念上调用复制ctor?.
这些问题的答案讨论了这样一个事实,即对于复制列表初始化,使用显式构造函数会使代码格式错误。事实上,如果我明确 ABC 的默认构造函数,我的第一个示例将无法编译,但那(也许)是另一回事。
所以,问题是:为什么在第一种情况下临时复制但在第二种情况下移动?在复制列表初始化的情况下,是什么阻止它被移动?
请注意,以下代码:
还会导致调用 ABC 的移动构造函数(并且没有复制构造函数调用),但可能涉及不同的机制。
您可以在以下位置试用代码(在 C++14 模式下使用 gcc-4.9.2):https ://ideone.com/Kc8xIn
c++ - std::map 成员编译器错误的支撑初始化
以下代码无法使用 Visual Studio 2013 进行编译。它使用 Xcode 6.1 (Clang 3.5) 进行编译。
两个声明报告的错误是:
但是,以下内容会编译:
请有人可以解释一下。
c++ - C++11:列表初始化中的 () 或 {}?
我指的是“工作草案 N3337 ”,据说与已发布的 C++11 标准最相似。
如果有可匹配的构造函数,则调用构造函数。
否则,它将使用聚合初始化。
现在,这是一个 using 的示例vector
,它有一个显式构造函数 fromsize_t
和一个initializer_list
构造函数:
在这里我很困惑。为什么构造函数的行为与vector
构造函数的行为不同S
?
c++ - C++11:列表初始化如何在用户定义的对象中赋值?
我有一个类库,它包括来自另一个类 Shelf 的成员对象shelf1。
Class Shelf 有几个变量,比如:
现在在库中,我想在库声明中初始化成员对象shelf1:
它们可以工作吗?列表初始化如何对变量的顺序起作用?
[更新] 这些代码是为了解释我的问题(我在现实世界中确实有类似的代码。但是放在这里太复杂了。所以我简化了我的问题)。
c++ - std::initializer_list 类型推导
最近我写了一个非常简单的类。
令我惊喜的是,它编译并正常工作。有人可以向我解释一下编译器如何能够推断出嵌套的大括号初始值设定项用于 astd::pair
吗?我正在使用 MSVS 2013。
c++ - 为什么这个程序在 C++14 中编译得很好,但在 C++11 编译器中编译得不好?
我最近在一个在线编译器上测试了下面这个简单的程序。在此处查看现场演示。它编译得很好并给出了预期的输出,但是当我在 Dev C++ IDE 上测试它时,它在编译过程中失败了。
这是我的程序:
它给了我以下错误:
我还在代码块 13.12 IDE 上尝试过它,它给了我与 Dev C++ 相同的错误。
这是一个新的 C++14 特性吗?为什么它在 C++11 编译器中不起作用?
c++ - 我可以使用 C++11 大括号初始化语法来避免为简单聚合声明琐碎的构造函数吗?
假设我有以下代码:
现在我想向Foo
具有特定内容的向量添加一个新项目,tag
而code
无需明确创建临时对象。这意味着我必须添加一个构造函数Foo
:
现在我可以使用emplace_back
:
但是当我不得不再次这样做——第 100 次——使用新创建的结构时,我想:我不能使用大括号初始值设定项吗?像这样:
这给了我一个编译错误(无法从'initializer-list'转换为'Foo'),但我希望这可以完成,我只是语法错误。
c++ - 何时允许编译器优化 auto+brace 样式初始化?
假设您有一个名为 Product 的类,定义如下:
然后像这样初始化一个变量:
我认为标准规定编译器必须在逻辑上执行以下操作:
- 构建一个临时产品
- move-construct p(使用临时产品)
但是允许编译器对此进行优化,以便直接构造 p。
我验证了这一点(Visual Studio 2013),事实上,编译器对此进行了优化,即使我们有自己的自定义(非默认)移动构造函数。这可以。
但是,如果我明确删除复制和移动构造函数,如下所示:
auto+brace 初始化仍然可以编译。我虽然编译器不得不阻止这种情况,因为不允许复制或移动。
奇怪的是,如果我将删除的复制和移动构造函数设为私有,如下所示:
然后 auto+brace 初始化不再编译。
这是预期的行为吗?这是 Visual Studio 2013(更新 3)中的错误吗?
注意:我尝试在ideone上编译它,当复制和移动构造函数被删除(和公共)时,它确实拒绝编译初始化。所以我认为这是一个 Visual Studio 错误。
c++ - 为什么按地址传递大括号初始化的临时地址需要在 MSVS 中显式转换为相同类型
在处理 Windows API 时,我试图通过替换两行代码来减少我的代码臃肿
单线
但偶然发现错误:
表达式必须是左值或函数指示符。
经过多次尝试,我终于想出了可以编译的代码(MSVS 2013u4):
为了更好地理解为什么需要演员,我建立了一个简单的测试项目:
并发现如果某些结构T
具有显式构造函数(如A
上面代码中的构造函数),则可以获取类型为大括号初始化的临时地址T
并将其传递给接受指针的函数T*
,但如果它没有有一个(如B
),则出现上述错误,只能通过显式转换为类型来克服T
。
所以问题是:为什么B
需要这种奇怪的铸造A
而不需要?
更新
现在很明显,将右值视为左值是 MSVS 中的扩展/功能/错误,是否有人愿意假装它实际上是一个功能(自 2010 年以来足以让 MS 维护它)并详细说明为什么A
需要B
通过临时变量以不同的方式来满足编译器?它必须与A的构造函数和B的缺乏有关......
c++ - C++/JNI 大括号封闭的初始化映射(Android NDK)
我有一个用 C++ 编写的引擎,可以与 AndroidStudio 中的 JNI 集成。我阅读并遵循我找到的所有教程。
在 Cpp 文件中有标头的导入,其中包括 2 个用大括号括起来的映射,像这样初始化(只是示例):
第一个以 2500 行开头...第二个是这样的:
应用程序.mk
这是错误:
jni/My_header.h:line: 错误: 无法将 '{{state_one, "State 1"}, {state_two, "State 2"}..} 从 '<bracket-enclosed initializer list>' 转换为 'std::地图<StateEnum, std::string>'
我还尝试将 c++ 文件编译为库,然后将其集成到我的 Android 项目中。结果是一样的。
任何人都可以帮助我。我不想将 2500 行地图初始化(使用 map.add(...))翻译成 5000 行。