问题标签 [in-class-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 回答
2535 浏览

c++ - 前向声明、unique_ptr 和类内初始化程序

我已阅读是否需要 std::unique_ptr<T> 才能知道 T 的完整定义?unique_ptr的前向声明?,但我的问题更具体。

以下编译:

以下没有:

错误


编辑:据我了解,这里发生的是类内初始化程序意味着能够unique_ptr<A>AUser. 由于类型unique_ptr<A>实际上是unique_ptr<A, default_delete<A>>,能够初始化它意味着能够初始化default_delete<A>。而且,为此,A必须完全定义。

这个推理中的薄弱环节是假设类内初始化器意味着在类声明时初始化相应数据成员的能力!这似乎是一个直观的不言而喻,因为初始化程序是声明的一部分。但是,如果我在标准中找到明确说明的内容,我会更舒服。否则我仍然可以想到不需要它的实施解决方案。例如,编译器可以简单地采用初始化表达式并将其仅应用于未明确给出属性初始化的构造函数。

那么,任何人都可以向我推荐一个标准部分/摘录,这意味着在第二种情况下需要完整定义 A 吗?我在标准中没有找到太多关于类内初始化器的信息(只发现它们被称为“非静态数据成员的大括号或相等初始化器”),但与此无关。

0 投票
2 回答
392 浏览

c++ - 在类初始化和初始化列表中

我最近发现你不能同时在类初始化和初始化列表中。以下代码失败:

如果我删除类初始化,初始化列表工作正常!

有人可以解释一下为什么不允许这样的事情吗?

0 投票
2 回答
633 浏览

c++ - 类内静态成员初始化

给定

gcc 4.8 说

错误:静态成员'S::rx'的非常量类内初始化无效

错误:(需要类外初始化)

错误:“S::rx”在声明时不能由非常量表达式初始化

我期望x是一个常量表达式,适合这样的初始化。这是一个 gcc 错误吗?如果没有,这里发生了什么?

0 投票
2 回答
240 浏览

c++ - 使用统一初始化语法使用初始化列表进行类内成员初始化?

我正在尝试使用 MSVC2013 编译以下内容:

编译器给我以下错误:SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

如果我将代码更改为:

该程序编译并运行良好。这是编译器的问题,还是我不懂语法?从我一直在阅读的内容来看,第一个版本应该可以编译。

0 投票
1 回答
1291 浏览

c++ - ISO C++ 禁止结构内的成员初始化

我正在编写一个模拟器并决定在一个结构中控制输入/输出模拟:

上面的代码对我来说看起来不错,并且似乎遵守所有规则......但我收到了上面标题中所述的错误消息。我四处搜索,人们说这个错误意味着不同的东西......但它是什么?

问题指向“LastFrequency”。

0 投票
1 回答
195 浏览

c++ - 非默认构造函数类型的继承构造函数 + 类内初始化失败

我在我的项目中遇到以下错误:

这是我正在使用的代码:

有谁知道为什么会这样?


显然,该语言愿意在继承的构造函数的末尾附加更多初始化(因为它愿意调用默认构造函数)。显然,它愿意在显式定义的构造函数的末尾隐式添加对非默认构造函数(类内初始化)的调用。但是由于某种我不明白的原因,它不愿意同时做这两个。

根据这个问题,完美转发还不够完美,不应该在这里使用。

注意:在实际情况下,构造函数B要复杂得多并且可能会发生变化,因此手动转发东西并不是一个真正可行的选择。

0 投票
3 回答
1571 浏览

c++ - C++11:使用“= {}”的类内初始化不适用于显式构造函数

在 C++11 中,我们可以使用“brace-or-equal-initializer”(标准中的词)进行类内初始化,如下所示:

但是如果我们取消注释explicit,它就不再编译了。GCC 4.7 和 4.9 是这样说的:

我发现这很令人惊讶。这段代码不能编译真的是 C++11 标准的意图吗?

删除=修复它:Foo foo { 42 };但我个人觉得这很难向几十年来习惯于这种形式的人解释=,而且由于标准指的是“大括号或相等初始化器”,为什么好的旧方法并不明显在这种情况下不起作用。

0 投票
2 回答
1900 浏览

c++ - 唯一指针类内初始化

假设我有一个unique_ptr要在类中初始化的成员对象,请参见下面的代码。为什么我必须使用统一初始化(花括号)?第二个声明吐出一个错误,比如

而且我不认为这是一个最令人头疼的解析问题,至少我不这么认为。

0 投票
3 回答
10200 浏览

c++ - 无法从成员变量中的初始化字符串推断数组大小的原因是什么?

考虑代码:

它无法同时使用 g++ 和 clang++ 编译,本质上是吐出

error: array bound cannot be deduced from an in-class initializer

我知道这可能是标准所说的,但是有什么特别好的理由吗?由于我们有一个字符串文字,因此编译器似乎应该能够毫无问题地推断出大小,类似于您简单地声明一个类外constC 类空终止字符串的情况。

0 投票
2 回答
183 浏览

c++ - 使用构造函数的类内成员初始化器:是否允许?

我最近在Danny Kalev的文章Get to Know the New C++11 Initialization Forms中发现了一段有趣的代码:

这条线string s("abc");对我来说似乎很可疑。我认为在类中初始化成员时不允许使用构造函数。并且这段代码(简化为class C { string s("abc");};`)不能编译

  • clang 3.6.1(编译器参数是-std=c++11 -Wall -Wextra -Werror -pedantic-errors
  • g++ 5.1.0(编译器参数相同-std=c++11 -Wall -Wextra -Werror -pedantic-errors:)
  • vc++ 18.00.21005.1(编译器参数是/EHsc /Wall /wd4514 /wd4710 /wd4820 /WX /Za
  • vc++ 19.00.22929.0(编译器参数由服务预定义/EHsc /nologo /W4 /c:)

我是对的,这篇文章有错误吗?