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

0 投票
2 回答
1323 浏览

c++ - 统一初始化中的尾随逗号

在统一初始化期间使用尾随逗号时是否存在任何潜在的语义差异?

我可以使用尾随逗号使编译器选择std::vector::vector(std::initializer_list< std::size_t >)构造函数而不是std::vector::vector(std::size_t, const std::size_t &)或者是否有任何其他具有上述语法的技巧?

我可以用它来检测是否存在std::initializer_list-constructor 重载吗?

考虑以下代码,必须选择哪个构造函数?

此代码在两种情况下都被接受并被gcc 8选中A(int)

0 投票
1 回答
74 浏览

c++ - 为什么在 c++ 中不允许使用括号进行默认初始化?

这是来自 Effective modern c++ 的示例。

0 投票
2 回答
450 浏览

c++ - 为什么 C++ 列表初始化也会考虑常规构造函数?

在 C++ 中,当使用 initializer_list 语法初始化对象时,当没有其他列表初始化规则适用时,对象的常规构造函数也参与重载决策。据我了解,以下代码调用 X::X(int)

但我不明白,为什么在 initializer_lists 的上下文中也考虑常规构造函数。我感觉现在很多程序员写 X{3} 来调用构造函数,而不是 X(3) 来调用构造函数。我根本不喜欢这种风格,因为它让我觉得对象没有常规的构造函数。

initializer_list 语法也可以用来调用常规构造函数的原因是什么?现在有理由比常规构造函数调用更喜欢这种语法吗?

0 投票
0 回答
59 浏览

c++ - 统一初始化语法不适用于 Visual Studio 2012

引入了统一初始化语法作为解决Most Vexing Parse的显式方法。

我相信http://en.cppreference.com将其称为Direct List Initialization

无论如何,无论您如何称呼它,它似乎都不适用于。给定这个例子:

我得到错误:

错误 C2601: bar: 局部函数定义是非法的

如果我改为这样做:const vector<int> bar(istream_iterator<int>(foo), istream_iterator<int>());我收到错误:

错误 C2228:左边.front必须有类/结构/联合

我可以使用之前的解决方法来解决这个问题:const vector<int> bar((istream_iterator<int>(foo)), istream_iterator<int>());但我觉得它令人沮丧。是否没有为实现统一初始化语法?

0 投票
2 回答
817 浏览

c++ - 为什么具有私有成员的聚合不支持 C++ 大括号初始化?

从概念上讲,我认为以下内容不会侵犯隐私。但这是被禁止的。

添加手动构造函数将允许对私有成员进行大括号初始化。但是聚合和 pod 的美妙之处在于您需要的编码量很少,因此这很烦人。

另一方面,我认为这是对隐私的侵犯,但这是标准允许的。

0 投票
0 回答
447 浏览

c++ - C++ 使用初始化列表处理统一初始化的基本原理是什么?

C++ 的统一初始化语法修复了最令人头疼的 parse。耶。但是在处理初始化列表时会引入混乱。嘘。现有的行为是:

将调用std::vector(std::initializer_list<T> init)而不是std::vector(size_type count);.

这个决定的理由是什么?特别是由于语言委员会正在发明新的语法,在我看来,其他可能的设计可能是:

  • 要求通过做来调用初始化列表构造函数std::vector the_vec = { 4 };。当然,这不再是“统一的”,但对我来说,要求所有初始化列表使用使用一种形式在概念上似乎更简单,尤其是当该形式与 C 中对象的聚合初始化相匹配时。

  • 要求通过做来调用初始化列表构造函数std::vector the_vec{{4}};。这在我看来在概念上也更简单。

  • 仅当调用其他构造函数std::vector the_vec{{4}};时才需要调用初始化列表构造函数。the_vec{4}我不太喜欢这样,因为很难判断在调用点调用了哪个构造函数,但至少这意味着不再需要旧的构造函数语法。

0 投票
1 回答
1436 浏览

c++ - C 数组和结构中的 C++ 统一初始化

我见过一些看起来像这样的旧代码:char foo[100] = { 0 };. 结构也会发生类似的事情,例如:STRUCT st = { 0 };. 这两种情况的意图都很明确,即对各自的变量进行零初始化。因此,char foo[100] {};并且STRUCT st {};会更惯用。

我的问题是:应该<variable> = { 0 }期望代码达到相同的结果吗?我已经使用发布构建二进制文件对此进行了测试,并且元素似乎是零初始化的,但这是否由标准保证?在我看来,<variable> = { 0 }应该只保证变量的第一个元素(数组元素或结构成员)为零。

char foo[100] = {};此外,类似的声明和指示的行为是什么STRUCT st = {}

(这个问题背后的动机是我会将所有声明更改为惯用形式,但如果不能保证零初始化,那么问题会更严重,值得一试。)

0 投票
2 回答
9229 浏览

c++ - 无法从大括号括起来的初始值设定项列表转换为标准元组

作为一个更大项目的一部分,我正在使用std::tuple模板;考虑以下代码:

根据这个答案C++17 支持来自copy-list-initialization 的元组初始化,但是似乎这种支持是有限的,因为我收到以下错误(GCC 7.2.0):

在这种情况下,有什么方法可以使用大括号括起来的语法吗?

一些上下文:这将在运算符重载中使用,所以我想我被绑定到元组并且不能使用可变参数,任何提示都被很好地接受。

额外:Clang 6 也抱怨

0 投票
1 回答
106 浏览

c++ - 统一初始化语法的使用

如果我有课

这两种初始化成员的方法有什么区别

我在一次代码审查中被告知要使用统一初始化语法,即大括号初始化。在这种情况下有区别吗?或者它只是一种风格偏好?

0 投票
4 回答
7048 浏览

c++ - 声明具有两种类型的变量:“int char”

我是 C++ 初学者,正在阅读Bjarne Stroustrup 的 Programming: Principles and Practice Using C++

3.9.2 不安全的转换部分,作者提到

当初始化器是整数文字时,编译器可以检查实际值并接受不意味着缩小的值:

我对这个声明感到困惑。它使用两种类型(intchar)。我以前从未在 Java 和 Swift 中看到过这样的声明(我比较熟悉的两种语言)。这是拼写错误还是有效的 C++ 语法?