问题标签 [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++ - C++11:缩小
我在 PDF 中阅读了以下段落:http: //www.stroustrup.com/what-is-2009.pdf
收窄
也许您注意到我一直使用 {} 初始化。或许,你也认为我在丑化代码,对一个新奇的功能过分迷恋?当然,这种情况会发生,但我认为情况并非如此。考虑:
我们可以就这两个定义的美学进行友好的讨论,您甚至可以指出 {} 版本比 = 需要多一次击键。但是,这两种形式之间存在一个显着差异,使我选择了 {}。{} 版本不允许缩小范围,我没有告诉您这两个定义是为具有 16 位整数的机器编写的。这意味着 x1 的值可能非常令人惊讶,而 x2 的定义会导致编译时错误。
但是当我尝试使用 'Ideone.com' c++11 在线编译器编译以下内容时,它显示成功
我期待编译错误。任何形式的帮助将不胜感激。
c++ - 在具有 unique_ptr 的函数调用中使用大括号初始化的自动类型推断失败
鉴于下面的代码,unique_ptr 和 Bar 之间的区别是什么bar ( { new int } );
?foo( { new int } );
clang 3.5 的编译错误:
c++ - 大括号初始化细节
在尝试使用大括号初始化时,可以发现使用时的一个微妙之处std::vector
,如以下示例所示:
输出是:
因此,在第一种情况下,(所谓的...)统一初始化初始化了一个包含三个空字符串的向量,而在第二种情况下,它初始化了一个仅包含一个值为 3 的整数的向量。
除此之外,在使用新的大括号初始化样式时是否还有其他“陷阱”和微妙之处需要考虑?
c++ - ={} 和 {} 风格的初始化在 C++11 中是否相同?
C++11 引入了 {} 样式的初始化。但是这两种形式
相同?
c++ - c++11中的bracket-init有效率问题吗?
我正在考虑将中型代码库重构为始终使用大括号初始化。有什么我应该注意的效率问题吗?
一些示例可能是 POD 类型和内置类型,那么具有大量构造参数的大型类呢?
c++ - 列表初始化和复制省略
考虑以下示例:
根据 8.5.16(C++11 标准)该行
被视为
(即创建了一个A 类型的临时对象并将其传递给A 类型的copy-ctor 来初始化一个x)。然后根据 12.8.31 编译器被允许(但不是强制)执行称为“复制省略”的优化,以消除创建 A 类型的临时代码,从而有效地使该行代码变为
(即没有创建临时对象,没有调用copy-ctors)。
现在,假设我在上面的示例中使用了列表初始化,如下所示:
或者
有人可以引用 C++11 标准中的适当段落来确认或否认 (1) 和/或 (2) 将始终(即不仅当编译器可以进行“复制省略”优化时)被视为
(即直接调用 A 的第一个构造函数,不创建临时对象,不复制 A 类型的对象)。
c++ - 数组默认值与列表初始化
我有以下代码,一个类似数组的结构的简化:
这在 clang 3.3 和 gcc 4.8.1 中编译良好,两者都带有-std=c++11
. 我正在尝试升级 gcc,所以我现在尝试 4.9.0。在这种情况下,第三个示例 ( ERROR (1)
) 实例化X
的构造函数 ( ERROR (2)
),此时编译器会报告
最后一个示例尝试默认初始化数组z
及其包含的数组;但是,如果我做对了,这里 gcc 基本上说包含的数组正在由 列表初始化{}
,这是不允许的,因为构造函数是显式的。
如果我添加以下任何一种形式的另一个默认构造函数,错误就消失了:
但不是
这种解决方法并不难,但是知道谁是错的,谁是对的,这样我就知道我在做什么以及为什么?
c++ - C++11 列表初始化不起作用
这是我的文件
screen.h
主文件
问题出在列表初始化行里面Window_mgr class
。编译器说:
但事实是这样的列表初始化在我的两个类外的尝试中正常运行(参见 main.cpp)。我以为是因为private
修饰符,但public
没有多大帮助。所以你能建议我吗,真正的问题在哪里?谢谢!
UPD我使用 MS VS Expess 2013 和 CTP 2013 VC++ 编译器。
c++11 - 大括号初始化并将共享指针从派生类转换为基类
我正在尝试使用大括号初始化,使用多个指向派生类的共享指针来初始化指向基类的共享指针向量。代码(去除不相关的细节后)如下所示:
当我在 Visual Studio 2013 下编译这段代码并在控制台中运行它时,结果是:
然后程序崩溃。这是意料之中的,大括号初始化与 to 的隐式转换不兼容std::shared_ptr<Derived>
,std::shared_ptr<Base>
还是 Visual Studio 中的错误?大括号初始化是否在幕后做了一些魔术,阻止了共享指针转换(例如,引用指针)?
c++11 - 使用统一初始化不危险吗?
几天前我发现了统一初始化,我到处都看到每个人都应该尽可能地使用它。
但是,我不禁认为这种新语法比它的价值更麻烦......
第一个例子
假设我编写了一个库,其中有一个这样的结构:
用户可以使用聚合初始化编写类似这样的内容:
现在,假设我更新了我的库,并且结构现在看起来像这样:
在 C++11 之前,用户代码会停止编译,这将迫使用户重写他的代码并使用构造函数。但是现在,代码将编译并被解释为统一初始化:
在用户不知道的情况下,更新他的库会使他的代码做一些非常不同的事情!
第二个例子
现在,让我们说我的图书馆中有这样的课程:
用户可以像这样使用它:
或者,使用统一初始化,如下所示:
再说一次,让我们说我更新了我的图书馆。类现在看起来像这样:
如果使用经典构造函数不会有问题:
但是如果调用统一初始化,代码解释将会改变:
基于这些示例,在我看来,用户使用统一初始化是极其危险的,因为当将内容添加到使用的库时,代码解释可能会发生变化,而根本没有任何警告。
更糟糕的是,统一初始化的引入使聚合初始化变得危险。
我错过了什么吗?是否存在使用统一初始化既安全又有用的情况?