问题标签 [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++ - 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} 时,所有编译都正确。如果我声明默认构造函数,它也会编译。为什么会这样?
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
c++ - 复制构造函数花括号初始化
“我们可以使用以下方法初始化尚未定义任何构造函数的类的对象:
- 成员初始化。
- 复制初始化。
- 默认初始化。
例如:
C++ 编程语言第 4 版。第 17.3.1 章
例如:
这必须有效,尽管我在使用 GCC 和使用 Clang 时都会遇到编译器错误。两个编译器中的错误都是“无法将数据转换为 int”。但是,实现复制构造函数时,这个错误会消失,或者没有实现它,而是使用圆括号语法。这个问题有点愚蠢,改变圆括号的卷曲问题就解决了。但是为什么不遵循 TC++PL 的规则?,是编译器问题还是我误解了什么?提前致谢。
c++ - 构造函数和转换
C++
我读过没有explicit
关键字和一个参数的构造函数(或对具有多个参数的 ctor 的单参数调用,其中除了一个以外的所有参数都具有默认值)可以执行一次隐式转换。给定两个类,其中Foo
的 ctor 有两个 int
参数,而Bar
' 的 ctor 有两个 Foo
参数,该语句似乎暗示Bar
使用两个不合格的 s 集调用 's ctorint
不应转换为Bar
使用两个 ' 调用 's ctor Foo
。那么,为什么下面会编译呢?
c++ - 当对象没有数据成员时,统一初始化无法复制
在更新一些代码以使用统一初始化时,我认为这将是现在“旧式”括号样式的现代替代品。我知道情况并非总是如此(明显的例子,vector<int>
),但我偶然发现了另一个我不理解的差异。
在clang3.5下编译失败,报错:(在gcc下也失败)
有两个不同的变化可以Object
使这项工作。向它添加一个数据成员,或者给它一个空的复制构造函数主体
我不明白为什么这些应该有所作为。
c++ - 如何在类定义中初始化一个向量成员变量?
以下代码使用 XCode 5.0 而不是 Visual Studio 2013 编译正常。
这是 Visual Studio 报告的错误:
我还没有找到如何在类定义中初始化这样的向量的示例。
哪个编译器是正确的?
如果语法无效,在构造函数初始化列表中初始化 m_vector 是唯一的选择吗?
c++ - 处理 C++11 初始化语法
由于 C++11 引入了新的统一初始化语法,许多人建议使用它来代替旧式语法。至少,如果不是因为这种所谓的极端情况:
使用 {}-always-style 会带来麻烦,尤其是在模板中。新语法似乎只有三种安全用法:
- 显式请求 std::initializer_list-constructors
- POD 构造函数
- 默认构造函数
但也有一种情况,我们必须使用统一的初始化语法:非静态数据成员初始化器。由于某种原因,C++ 可以识别
但无法处理
问题 #1:为什么 () 语法在函数内部起作用而不是在类中起作用?有谁知道这背后的原理?
综上所述,最后我们遇到了这个愚蠢的案例:
当然,您也不能将 auto 用于数据成员。所以我要么不得不笨拙地混合所有语法,要么根本不使用这些功能。
问题2:我是不是误会了什么?这不可能是预期的行为,可以吗?
c++ - 使用花括号进行聚合初始化
在 C++11 中,是否允许使用花括号语法复制聚合?我有以下代码:
下面的每一个陈述都有效。
但是,下面的第二个语句引发了错误cannot convert 's' to 'int' in initialization
。
我正在使用 gcc 4.8.2。为什么我会收到此错误?
c++ - ={} 和 {} 风格的初始化在 C++11 中是否相同?
C++11 引入了 {} 样式的初始化。但是这两种形式
相同?
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
构造函数。
您的代码可以默默地破坏这一事实让我很担心。