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

c++ - gcc 4.8中静态constexpr成员数组的初始化

以下代码在使用 -std=c++11 时在 gcc 4.9.1 和 clang-3.6 中编译和运行:

但是,它在 gcc 4.8.3 中失败,导致错误消息

顺便说一句,如果我做同样的事情但创建bars一个静态 const 全局数组,它在 gcc 4.8 和 clang 中编译得很好。如果我将列表中的每个整数文字都用一对额外的{}.

那么这是 gcc 4.8 中的错误吗?标准说什么是合适的语法?当我省略额外的大括号时,调用了 c++11 统一初始化标准的哪一部分?

编辑:看起来标准说这应该调用聚合初始化,这应该允许“大括号省略”。因此,这似乎是 gcc 4.8 中的一个错误,已由 gcc 4.9 修复,但我对阅读该标准完全没有信心。我似乎也无法在 gcc 的错误跟踪器中找到任何关于此的错误报告,所以我很容易出错。

0 投票
1 回答
574 浏览

c++ - c++11数组初始化不会调用复制构造函数

我正在制作一个使用其大小模板化的数组的小类。这是一些代码...

.hpp

.cc

在构造函数的成员初始化中,我不能combo{sequence}用作初始化器,因为它只接受sf::Keyboard::Key类型。如果它要求一个 ,这是有道理的initializer_list,但这对我来说似乎很奇怪。对于其他标准容器,我可以使用 {} 表示法调用复制构造函数。这是一个怪癖std::array吗?或者也许是我的clang中的一个错误?

以防万一,这是我的clang版本:

0 投票
1 回答
116 浏览

c++ - Uniform initialization for fundamental types?

Is it a good practice to use these definitions for fundamental types?

They can be easily mistaken for function definitions.

0 投票
5 回答
85 浏览

c++ - C++中初始化的说明

在以下示例中,我真的很困惑:

它工作正常并给出了预期的结果。但是如果我像下面这样修改上面的代码。

在上面的程序编译中显示了多个错误。为什么在第一个程序中允许统一初始化但在第二个程序中不允许?我哪里错了?

0 投票
2 回答
1373 浏览

c++ - 联合的活跃成员,统一初始化和构造函数

正如C++ 标准的(工作草案)所说:

9.5.1 [class.union]

在一个union中,任何时候最多可以有一个非静态数据成员处于活动状态,即任何时候最多可以有一个非静态数据成员的值存储在一个union中。[...]联合的大小足以包含其最大的非静态数据成员。每个非静态数据成员都被分配,就好像它是结构的唯一成员一样。联合对象的所有非静态数据成员具有相同的地址。

但是我不知道如何确定哪个是工会的活跃成员,而且我没有足够的习惯来深入研究标准以找出标准对它的描述,我试图弄清楚活跃成员是如何设置的但我发现它是如何交换的:

9.5.4 [class.union]

[注意:通常,必须使用显式析构函数调用和放置新运算符来更改联合的活动成员。—<em>尾注] [示例:考虑u一个union type U具有非静态数据成员 mMntype的对象N。如果M具有非平凡析构函数和N非平凡构造函数(例如,如果它们声明或继承虚函数),则 u 的活动成员可以安全地从使用析构函数和放置 new 运算符切换mn,如下所示:

—<em>结束示例]

所以我的猜测是,工会的活跃成员是第一个分配、使用、构建或放置新的成员;但这对于统一初始化有点棘手,请考虑以下代码:

上面代码中哪个是工会的活跃成员?是std::cout从工会的活跃成员那里阅读吗?下面的代码呢?

使用上面的代码,我们可以初始化嵌套的匿名结构或数组,如果我只提供一个整数,我可以初始化,或者Foo::a......哪个是活动成员?Foo::arrayFoo::integer

我猜活动成员在上述所有情况下都是匿名结构,但我不确定。

如果我想激活一个或另一个联合成员,我应该提供一个构造函数来激活它吗?

我几乎可以肯定 #1 和 #3 会将匿名结构和整数标记为活动联合,但我不知道 #2 因为在我们到达构造函数的主体的那一刻,成员已经被构造了!那么我们是在召唤std::copy一个不活跃的工会成员吗?

问题:

  • Foo如果它是使用以下统一初始化构造的,则 哪些是活动的联合成员:
    • Foo{};
    • Foo{1,2,3,4};
    • Foo{1};
  • 在#2 的构造函数中BarBar::array活跃的联合成员吗?
  • 我可以在标准中的什么地方阅读到哪个是活跃的工会成员,以及如何在没有放置新的情况下设置它?
0 投票
3 回答
219 浏览

c++ - 这个 C++ C11 语法是什么:“= {}”?

我在一个 c++ 文件中遇到了这种语法:

它有什么作用?它只是调用默认构造函数吗?

0 投票
1 回答
1643 浏览

c++ - 显式复制构造函数和统一初始化

显式复制构造函数不允许类似Foo foo = bar;,并强制复制使用 as Foo foo(bar);。此外,显式复制构造函数也不允许从函数中按值返回对象。但是,我尝试用大括号替换复制初始化,就像这样

我得到了错误(g ++ 5.2)

错误:没有用于调用 'Foo::Foo(Foo&)' 的匹配函数

或 (clang++)

错误:结构初始化程序中的多余元素

删除explicit使代码在 g++ 下可编译,clang++ 仍然失败并出现相同的错误(感谢@Steephen)。这里发生了什么?统一初始化是否被视为初始化列表构造函数(胜过所有其他构造函数)?但是如果是这样的话,为什么程序在复制构造函数不显式的情况下编译呢?

0 投票
2 回答
5245 浏览

c++ - C++11统一初始化:字段初始化器不是常量

我正在尝试实例化一组这样的字符串:

现在,当我这样做时,我得到了这些错误(都在这一行):

如果我假设集合中的字符串不被视为 const,这对我来说是有意义的。这真的是这里的问题吗?不幸的是,我找不到将初始化程序中的这些字符串声明为 const 的方法。这可能吗?

0 投票
0 回答
79 浏览

c++ - 统一初始化和 std::initializer_list

我正在学习 C++,并且我正在阅读有关列表初始化的内容。经过一番困惑,由于语法重叠,我了解到统一初始化和列表初始化确实是 C++11 的两个不同(尽管我刚才说重叠)的新特性。所以,在我问我的问题之前,我想回顾一下,如果我弄错了,请纠正我(在此之前,某些事情会成为对这个话题的误解..)

就内置类型而言,初始化它们的语法如下(为了便于阅读,我假设为 int):

现在到有趣的部分,使用聚合类型(数组和聚合结构)的统一初始化。在 C++11 之前,我可以使用列表初始化程序初始化数组和聚合类:

现在,我知道新标准允许我使用新语法进行统一初始化:

这对于在构造函数的成员初始化列表中使用可能会派上用场。

现在,到类类型。如果一个类没有定义 initializers_list 构造函数:

我知道当一个类定义一个 class_type::class_type(const std::initializer_list&) 构造函数时,它优先于其他构造函数(除非它是一个空列表,然后默认构造函数优先)。

现在,我的问题是:

=当我将它与花括号列表一起使用时会发生什么变化?我能想到的唯一区别是初始化列表构造函数是否显式。是

一样

那么是否涉及复制初始化隐式转换?这是唯一的区别吗?

请纠正我,如果我说了什么明显的错误!

0 投票
1 回答
333 浏览

c++ - 为什么 std::string{"const char ptr"} 有效?

我可以看到 std::string 只有一个带有initializer_list:的 CTORstring (initializer_list<char> il);所以初始化列表应该与字符一起使用,对吧?为什么std::string{"some_str"}有效,它得到了const char*,对吧?