问题标签 [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.

0 投票
0 回答
1585 浏览

c++ - C++11:缩小

我在 PDF 中阅读了以下段落:http: //www.stroustrup.com/what-is-2009.pdf

收窄

也许您注意到我一直使用 {} 初始化。或许,你也认为我在丑化代码,对一个新奇的功能过分迷恋?当然,这种情况会发生,但我认为情况并非如此。考虑:

我们可以就这两个定义的美学进行友好的讨论,您甚至可以指出 {} 版本比 = 需要多一次击键。但是,这两种形式之间存在一个显着差异,使我选择了 {}。{} 版本不允许缩小范围,我没有告诉您这两个定义是为具有 16 位整数的机器编写的。这意味着 x1 的值可能非常令人惊讶,而 x2 的定义会导致编译时错误。

但是当我尝试使用 'Ideone.com' c++11 在线编译器编译以下内容时,它显示成功

我期待编译错误。任何形式的帮助将不胜感激。

0 投票
1 回答
155 浏览

c++ - 在具有 unique_ptr 的函数调用中使用大括号初始化的自动类型推断失败

鉴于下面的代码,unique_ptr 和 Bar 之间的区别是什么bar ( { new int } );foo( { new int } );

clang 3.5 的编译错误:

0 投票
1 回答
289 浏览

c++ - 大括号初始化细节

在尝试使用大括号初始化时,可以发现使用时的一个微妙之处std::vector,如以下示例所示:

输出是:

因此,在第一种情况下,(所谓的...)统一初始化初始化了一个包含三个空字符串的向量,而在第二种情况下,它初始化了一个仅包含一个值为 3 的整数的向量。

除此之外,在使用新的大括号初始化样式时是否还有其他“陷阱”和微妙之处需要考虑?

0 投票
3 回答
1259 浏览

c++ - ={} 和 {} 风格的初始化在 C++11 中是否相同?

C++11 引入了 {} 样式的初始化。但是这两种形式

相同?

0 投票
1 回答
204 浏览

c++ - c++11中的bracket-init有效率问题吗?

我正在考虑将中型代码库重构为始终使用大括号初始化。有什么我应该注意的效率问题吗?

一些示例可能是 POD 类型和内置类型,那么具有大量构造参数的大型类呢?

0 投票
1 回答
414 浏览

c++ - 列表初始化和复制省略

考虑以下示例:

根据 8.5.16(C++11 标准)该行

被视为

(即创建了一个A 类型的临时对象并将其传递给A 类型的copy-ctor 来初始化一个x)。然后根据 12.8.31 编译器被允许(但不是强制)执行称为“复制省略”的优化,以消除创建 A 类型的临时代码,从而有效地使该行代码变为

(即没有创建临时对象,没有调用copy-ctors)。

现在,假设我在上面的示例中使用了列表初始化,如下所示:

或者

有人可以引用 C++11 标准中的适当段落来确认或否认 (1) 和/或 (2) 将始终(即不仅当编译器可以进行“复制省略”优化时)被视为

(即直接调用 A 的第一个构造函数,不创建临时对象,不复制 A 类型的对象)。

0 投票
1 回答
79 浏览

c++ - 数组默认值与列表初始化

我有以下代码,一个类似数组的结构的简化:

这在 clang 3.3 和 gcc 4.8.1 中编译良好,两者都带有-std=c++11. 我正在尝试升级 gcc,所以我现在尝试 4.9.0。在这种情况下,第三个示例 ( ERROR (1)) 实例化X的构造函数 ( ERROR (2)),此时编译器会报告

最后一个示例尝试默认初始化数组z及其包含的数组;但是,如果我做对了,这里 gcc 基本上说包含的数组正在由 列表初始化{},这是不允许的,因为构造函数是显式的。

如果我添加以下任何一种形式的另一个默认构造函数,错误就消失了:

不是

这种解决方法并不难,但是知道谁是错的,谁是对的,这样我就知道我在做什么以及为什么?

0 投票
0 回答
265 浏览

c++ - C++11 列表初始化不起作用

这是我的文件
screen.h

主文件

问题出在列表初始化行里面Window_mgr class。编译器说:

但事实是这样的列表初始化在我的两个类外的尝试中正常运行(参见 main.cpp)。我以为是因为private修饰符,但public没有多大帮助。所以你能建议我吗,真正的问题在哪里?谢谢!

UPD我使用 MS VS Expess 2013 和 CTP 2013 VC++ 编译器。

0 投票
0 回答
36 浏览

c++11 - 大括号初始化并将共享指针从派生类转换为基类

我正在尝试使用大括号初始化,使用多个指向派生类的共享指针来初始化指向基类的共享指针向量。代码(去除不相关的细节后)如下所示:

当我在 Visual Studio 2013 下编译这段代码并在控制台中运行它时,结果是:

然后程序崩溃。这是意料之中的,大括号初始化与 to 的隐式转换不兼容std::shared_ptr<Derived>std::shared_ptr<Base>还是 Visual Studio 中的错误?大括号初始化是否在幕后做了一些魔术,阻止了共享指针转换(例如,引用指针)?

0 投票
1 回答
543 浏览

c++11 - 使用统一初始化不危险吗?

几天前我发现了统一初始化,我到处都看到每个人都应该尽可能地使用它。

但是,我不禁认为这种新语法比它的价值更麻烦......


第一个例子

假设我编写了一个库,其中有一个这样的结构:

用户可以使用聚合初始化编写类似这样的内容:

现在,假设我更新了我的库,并且结构现在看起来像这样:

在 C++11 之前,用户代码会停止编译,这将迫使用户重写他的代码并使用构造函数。但是现在,代码将编译并被解释为统一初始化:

在用户不知道的情况下,更新他的库会使他的代码做一些非常不同的事情!


第二个例子

现在,让我们说我的图书馆中有这样的课程:

用户可以像这样使用它:

或者,使用统一初始化,如下所示:

再说一次,让我们说我更新了我的图书馆。类现在看起来像这样:

如果使用经典构造函数不会有问题:

但是如果调用统一初始化,代码解释将会改变:


基于这些示例,在我看来,用户使用统一初始化是极其危险的,因为当将内容添加到使用的库时,代码解释可能会发生变化,而根本没有任何警告。

更糟糕的是,统一初始化的引入使聚合初始化变得危险。

我错过了什么吗?是否存在使用统一初始化既安全又有用的情况?