问题标签 [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::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)
。
c++ - 为什么在 c++ 中不允许使用括号进行默认初始化?
这是来自 Effective modern c++ 的示例。
c++ - 为什么 C++ 列表初始化也会考虑常规构造函数?
在 C++ 中,当使用 initializer_list 语法初始化对象时,当没有其他列表初始化规则适用时,对象的常规构造函数也参与重载决策。据我了解,以下代码调用 X::X(int)
但我不明白,为什么在 initializer_lists 的上下文中也考虑常规构造函数。我感觉现在很多程序员写 X{3} 来调用构造函数,而不是 X(3) 来调用构造函数。我根本不喜欢这种风格,因为它让我觉得对象没有常规的构造函数。
initializer_list 语法也可以用来调用常规构造函数的原因是什么?现在有理由比常规构造函数调用更喜欢这种语法吗?
c++ - 统一初始化语法不适用于 Visual Studio 2012
c++11引入了统一初始化语法作为解决Most Vexing Parse的显式方法。
我相信http://en.cppreference.com将其称为Direct List Initialization。
无论如何,无论您如何称呼它,它似乎都不适用于visual-studio-2012。给定这个例子:
我得到错误:
错误 C2601:
bar
: 局部函数定义是非法的
如果我改为这样做:const vector<int> bar(istream_iterator<int>(foo), istream_iterator<int>());
我收到错误:
错误 C2228:左边
.front
必须有类/结构/联合
我可以使用c++11之前的解决方法来解决这个问题:const vector<int> bar((istream_iterator<int>(foo)), istream_iterator<int>());
但我觉得它令人沮丧。是否没有为visual-studio-2012实现统一初始化语法?
c++ - 为什么具有私有成员的聚合不支持 C++ 大括号初始化?
从概念上讲,我认为以下内容不会侵犯隐私。但这是被禁止的。
添加手动构造函数将允许对私有成员进行大括号初始化。但是聚合和 pod 的美妙之处在于您需要的编码量很少,因此这很烦人。
另一方面,我认为这是对隐私的侵犯,但这是标准允许的。
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}
我不太喜欢这样,因为很难判断在调用点调用了哪个构造函数,但至少这意味着不再需要旧的构造函数语法。
c++ - C 数组和结构中的 C++ 统一初始化
我见过一些看起来像这样的旧代码:char foo[100] = { 0 };
. 结构也会发生类似的事情,例如:STRUCT st = { 0 };
. 这两种情况的意图都很明确,即对各自的变量进行零初始化。因此,char foo[100] {};
并且STRUCT st {};
会更惯用。
我的问题是:应该<variable> = { 0 }
期望代码达到相同的结果吗?我已经使用发布构建二进制文件对此进行了测试,并且元素似乎是零初始化的,但这是否由标准保证?在我看来,<variable> = { 0 }
应该只保证变量的第一个元素(数组元素或结构成员)为零。
char foo[100] = {};
此外,类似的声明和指示的行为是什么STRUCT st = {}
?
(这个问题背后的动机是我会将所有声明更改为惯用形式,但如果不能保证零初始化,那么问题会更严重,值得一试。)
c++ - 无法从大括号括起来的初始值设定项列表转换为标准元组
作为一个更大项目的一部分,我正在使用std::tuple
模板;考虑以下代码:
根据这个答案C++17 支持来自copy-list-initialization 的元组初始化,但是似乎这种支持是有限的,因为我收到以下错误(GCC 7.2.0):
在这种情况下,有什么方法可以使用大括号括起来的语法吗?
一些上下文:这将在运算符重载中使用,所以我想我被绑定到元组并且不能使用可变参数,任何提示都被很好地接受。
额外:Clang 6 也抱怨
c++ - 统一初始化语法的使用
如果我有课
这两种初始化成员的方法有什么区别
我在一次代码审查中被告知要使用统一初始化语法,即大括号初始化。在这种情况下有区别吗?或者它只是一种风格偏好?
c++ - 声明具有两种类型的变量:“int char”
我是 C++ 初学者,正在阅读Bjarne Stroustrup 的 Programming: Principles and Practice Using C++。
在3.9.2 不安全的转换部分,作者提到
当初始化器是整数文字时,编译器可以检查实际值并接受不意味着缩小的值:
我对这个声明感到困惑。它使用两种类型(int
和char
)。我以前从未在 Java 和 Swift 中看到过这样的声明(我比较熟悉的两种语言)。这是拼写错误还是有效的 C++ 语法?