问题标签 [uniform-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++ - std::make_pair vs C++11 统一初始化器
使用后者有缺点吗?是std::make_pair
更通用/兼容还是它们真的可以互换?
谢谢!
c++ - 引用的统一初始化
我目前正在尝试了解 C++0x 的新统一初始化。不幸的是,我在使用引用的统一初始化时绊倒了。例子:
这个例子工作正常:
(更新Comeau 会为该示例引发错误,因此 gcc 可能也不应该编译它)
现在,如果我使用自定义数据类型而不是整数,它就不再起作用了:
不幸的是,我没有在标准草案中找到相关部分。我的猜测是我误解了统一初始化的用法,因为 Comeau 抱怨此消息:
那么,你们中的某个人可以指出我正确的方向吗?
如果您想知道为什么这个问题是相关的以及为什么我不只使用Y &ref(y)
:我希望能够在构造函数的初始化列表中使用统一初始化:
这将失败并显示与上述相同的错误消息。
笔记:
- 我正在使用
LANG=C
启用英文错误消息。 - gcc 版本:4.6.1
c++ - 常量引用的默认参数中使用的统一初始化程序
这是合法的 c++0x 语法吗?
因为如果是这样,我只是在 GCC 4.6 中发现了一个错误。
我得到的错误是:
错误:“{”标记之前的预期主表达式
这是......合乎逻辑的......如果它是非法的。
更新:正如@Kerrek 所说明的那样,这会渗透到普通的 C++03 中,并带有聚合和旧的大括号初始化语法。为什么这是不可能的?标准中是否禁止?还是编译器有问题?或者这是一个疏忽?我认为允许将其作为显式调用构造函数的替代方法没有任何严重问题。
c++ - C++0x 统一初始化“奇怪”
像许多人一样,我对C++0x感到非常兴奋。我尝试在新项目中学习和使用新功能,这样我就可以编写出最好的、最易于维护的代码。
不用说,我喜欢新初始化器背后的想法。所以我正在看它们,这些对我来说很有意义:
对我来说没有意义的是:
只是感觉……很奇怪。我不确定人们想使用什么语法来模仿它,它看起来并不“正确”。
这种语法背后的设计/思想是什么?
似乎有所不同的唯一示例是这样的:
这将调用初始化列表构造函数,但为什么不直接写这个:
做每个人都已经习惯的事情吗?
initialization - 如何使用统一初始化程序“减少键入以创建 C++ 类型”?
我玩了很多新的统一初始化。{}
像这样:
毫无疑问,这种初始化可能会改变我们对 C++ 的编程。但我想知道在Herb Sutter 常见问题解答中阅读Alfonses 的问题时是否错过了一些神奇的可能性。
Alfonse:统一初始化(当可以推断出正在构造的类型时使用 {} 调用构造函数)有可能从根本上减少创建 C++ 类型所需的类型数量。就像 lambdas 一样,它会改变人们编写 C++ 代码的方式。[...]
有人可以给我一个例子来说明Alfonse在这里的设想吗?
c++ - 如何使用 C++11 统一初始化语法?
我无法理解何时以及如何在 C++11 中使用新的统一初始化语法。
例如,我得到这个:
为什么它在第二种情况下不起作用?错误是:
使用这个版本的 g++ g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
。
对于原始数据,我应该使用什么语法?
c++ - std::allocator 中的直接初始化与统一初始化
这个问题也已经提交到Usenet,那里比较合适,但这是一个更大更可靠的论坛。
std::allocator::construct
被定义为使用括号将其参数参数包转发到对象构造,即直接初始化。
如果它使用大括号,也就是统一初始化,我们可以从函数初始化聚合数据类型,例如std::make_shared
和
container::emplace
。此外,可以将初始化列表的内容放入此类函数的参数列表中,从而解决initializer_list
转发下的类型推导问题。
是否考虑并拒绝了这种替代方案?转换未来的标准是否为时已晚?看起来这将是一个突破性的变化,但不是特别令人发指的变化。
c++ - MSVC10/11 中缺少统一初始化程序的宏/内联函数解决方法
是否有一种半透明的方式可以更容易地以类似于使用统一初始化程序的方式进行编码,而不使用实际功能?
我愿意放弃统一初始化程序的类型安全和其他约束(我会用其他编译器检查它们的有效性),但我不想放弃像这样的好语句
将这些转换为非统一初始化程序编译器的兼容代码的宏对我来说非常有用。
c++ - 为什么 emplace_back() 不使用统一初始化?
以下代码:
使用 GCC 编译时出现以下错误:
建议vector
使用常规()
构造函数语法从参数构造元素到emplace_back()
. 为什么不vector
使用{}
统一初始化语法来制作上述示例?
在我看来,使用没有什么可失去的{}
(它在有构造函数时调用构造函数,但在没有构造函数时仍然有效),使用{}
- 之后更符合 C++11 的精神总而言之,统一初始化的全部意义在于它被统一使用 - 即无处不在 - 来初始化对象。
c++ - 为什么'std::vectorb{2};' 创建一个 1 元素向量,而不是 2 元素向量?
过去几天我一直在玩 C++11,但我想出了一些奇怪的东西。
如果我想统一初始化一个int:
但是如果我对 std::vector 做同样的事情:
不构造二元素数组,而是构造一个元素值为 2 的数组。似乎要获得这种效果,需要更加明确:
但不像 b 的声明 - 这似乎不一致。我见过一些其他的东西达到同样的效果。我要问的是——这种行为是在最终的 C++11 标准中,还是只是在早期实施的草案中?如果是这样,为什么标准委员会会包括这种行为?似乎它违背了统一初始化的全部目的,因为必须记住哪些类具有初始化列表构造函数,并且只对这些类使用旧的 () 语法而不是 {}。或者完全放弃统一初始化。
这似乎是一个很大的“陷阱”。但它可能有我不知道的优点。
编辑:这段代码:
在 gcc 4.6.2 上输出“2”