问题标签 [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 投票
3 回答
928 浏览

c++ - gcc 4.8.1 中的 C++11:复制构造函数的列表初始化不起作用

我鼓励这个问题:如果我有

gcc 给出:

move.cc:在函数'int main()'中:moves.cc:15:7:错误:'A'A b {a}的初始化程序太多;

但是当我使用 A b(a) 而不是 A b{a} 时,所有编译都正确。如果我声明默认构造函数,它也会编译。为什么会这样?

0 投票
1 回答
866 浏览

c++ - 为什么某些类型不适用于统一初始化语法?

在将我的一些 C++98 代码更新为 C++11 时,我注意到统一初始化并不是那么统一。其中一些与不完整类型有关,例如void,而另一些与 pod 有关。例如,对于普通可复制类型,当初始化涉及复制/移动构造函数时,统一初始化不适用于直接初始化或复制初始化。

例如

第一部分编译时,后半部分失败error: compound literal of non-object type 'void'

在这里,后半部分的复制构造也失败了error: cannot convert 'pod' to 'int' in initialization。虽然我认为,这个pod类在 c++11 中是一个普通类型(甚至可以是普通可复制类型),但除了原始类型外,问题仍然相同

笔记:

虽然以下工作,

这不,

我还注意到 C 数组确实适用于统一初始化,但不适用于复制/移动构造函数。但这可能是由于数组是一个没有复制/移动构造函数或赋值的聚合。虽然我不知道为什么在 c++11 中不允许使用这些语法(特别是当它们是类成员时,隐式复制/移动就是这样做的)。

那么,为什么我不能盲目地将所有 C++98 初始化更改为 C++11 样式的统一初始化(嗯,除了具有初始化列表的类型!)?

我正在使用 GCC 4.8.1

0 投票
1 回答
3444 浏览

c++ - 复制构造函数花括号初始化

“我们可以使用以下方法初始化尚未定义任何构造函数的类的对象:

  • 成员初始化。
  • 复制初始化。
  • 默认初始化。

例如:

C++ 编程语言第 4 版。第 17.3.1 章

例如:

这必须有效,尽管我在使用 GCC 和使用 Clang 时都会遇到编译器错误。两个编译器中的错误都是“无法将数据转换为 int”。但是,实现复制构造函数时,这个错误会消失,或者没有实现它,而是使用圆括号语法。这个问题有点愚蠢,改变圆括号的卷曲问题就解决了。但是为什么不遵循 TC++PL 的规则?,是编译器问题还是我误解了什么?提前致谢。

0 投票
5 回答
146 浏览

c++ - 构造函数和转换

C++

读过没有explicit关键字和一个参数的构造函数(或对具有多个参数的 ctor 的单参数调用,其中除了一个以外的所有参数都具有默认值)可以执行一次隐式转换。给定两个类,其中Foo的 ctor 有两个 int参数,而Bar' 的 ctor 有两个 Foo参数,该语句似乎暗示Bar使用两个不合格的 s 集调用 's ctorint不应转换为Bar使用两个 ' 调用 's ctor Foo。那么,为什么下面会编译呢?

0 投票
2 回答
371 浏览

c++ - 当对象没有数据成员时,统一初始化无法复制

在更新一些代码以使用统一初始化时,我认为这将是现在“旧式”括号样式的现代替代品。我知道情况并非总是如此(明显的例子,vector<int>),但我偶然发现了另一个我不理解的差异。

在clang3.5下编译失败,报错:(在gcc下也失败)

有两个不同的变化可以Object使这项工作。向它添加一个数据成员,或者给它一个空的复制构造函数主体

我不明白为什么这些应该有所作为。

0 投票
2 回答
8149 浏览

c++ - 如何在类定义中初始化一个向量成员变量?

以下代码使用 XCode 5.0 而不是 Visual Studio 2013 编译正常。

这是 Visual Studio 报告的错误:

我还没有找到如何在类定义中初始化这样的向量的示例。

哪个编译器是正确的?

如果语法无效,在构造函数初始化列表中初始化 m_vector 是唯一的选择吗?

0 投票
2 回答
249 浏览

c++ - 处理 C++11 初始化语法

由于 C++11 引入了新的统一初始化语法,许多人建议使用它来代替旧式语法。至少,如果不是因为这种所谓的极端情况:

使用 {}-always-style 会带来麻烦,尤其是在模板中。新语法似乎只有三种安全用法:

  1. 显式请求 std::initializer_list-constructors
  2. POD 构造函数
  3. 默认构造函数

但也有一种情况,我们必须使用统一的初始化语法:非静态数据成员初始化器。由于某种原因,C++ 可以识别

但无法处理

问题 #1:为什么 () 语法在函数内部起作用而不是在类中起作用?有谁知道这背后的原理?

综上所述,最后我们遇到了这个愚蠢的案例:

当然,您也不能将 auto 用于数据成员。所以我要么不得不笨拙地混合所有语法,要么根本不使用这些功能。

问题2:我是不是误会了什么?这不可能是预期的行为,可以吗?

0 投票
2 回答
994 浏览

c++ - 使用花括号进行聚合初始化

在 C++11 中,是否允许使用花括号语法复制聚合?我有以下代码:

下面的每一个陈述都有效。

但是,下面的第二个语句引发了错误cannot convert 's' to 'int' in initialization

我正在使用 gcc 4.8.2。为什么我会收到此错误?

0 投票
3 回答
1259 浏览

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

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

相同?

0 投票
2 回答
6070 浏览

c++ - 为什么使用 std::initializer_list 的构造函数不首选双花括号语法

统一初始化是一个重要且有用的 C++11 特性。但是,您不能{}随处使用,因为:

注意到在 eg 上的聚合初始化std::arrays需要使用{{}},在我看来,通过要求 a调用构造函数采用 a ,可以避免选择向量构造函数的整个问题:{{}}std::initializer_list

我确定这是讨论过的,那么反对这个的原因是什么?标准提案中的报价/链接是首选答案。

更新。N2532中有一点指出:

(3) 可能的令人讨厌的歧义情况仅发生在简短的初始化列表 [...]

(5) 为什么语言规则要强迫想要简洁和多义性控制(出于非常好的理由)的程序员写更多的东西来取悦那些喜欢(出于非常好的理由)更明确的程序员——并且可以这样做?

[...]

假设程序员期望调用 f(X)。af(Y) 如何“劫持”一个电话?

(4) 假设 X 没有初始化列表构造函数,但 Y 有。在这种情况下,赋予初始化列表构造函数的优先级有利于劫持者(请记住,我们假设程序员以某种方式期望调用 f(X))。这类似于有人期望 f(y) 使用用户定义的转换来调用 f(X) 并且有人附带一个完全匹配的 f(Y)。我认为期望使用 {...} 的人会记住初始化列表构造函数的可能性是公平的。[强调我的]

我想关键在于can be,这意味着您不必使用统一初始化。正确使用{}很难,因为:

  • 您不仅要检查要调用的构造函数,还要检查任何构造函数,initializer_list它可能会赢得(并且可能会)胜过它;

  • 如果您使用编写代码{}并且将来有人添加了std::initializer_list构造函数,则您的代码可能会中断并这样做默默地这样做。

即使你有一个A带有构造函数的类A(int, bool)and A(std::initializer_list<double>),后者将被选择而不是前者A a{0, false};(IMO 是疯了),所以我觉得它真的在具有或可能具有的类上使用统一初始化困难(需要水晶球超级大国)initializer_list构造函数。

您的代码可以默默地破坏这一事实让我很担心。