问题标签 [defaulted-functions]

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 回答
205 浏览

c++ - C++11 删除/默认构造函数

我对如何/为什么在 C++11 和 C++17 中调用构造函数感到有点困惑。

因此,当我取消注释某些行组合(并使用c ++ 17标准标志与clang编译)时会发生什么,我感到困惑:

  • 1、编译。列出 init 的 forAA1,以及默认的复制构造函数 forA2
  • 2、编译。A和 list init (?) 的默认构造A1函数,以及 A2 的默认复制构造函数
  • 1 + 3 或 2 + 3,编译失败,因为删除了复制构造函数A2
  • 1 + 4,编译。A和 list init A1(?) 的默认构造函数,以及A2
  • 2 + 4,编译。A和 list init (?) 的默认构造A1函数,以及 A2 的默认复制构造函数
  • 1 + 5,编译失败。说A缺少(删除)默认构造函数,并且没有匹配的构造函数A1
  • 2 + 5,编译失败。没有匹配的构造函数A1

我想我了解其中的大部分内容,但我很困惑为什么 1 + 5 和 2 + 5 编译失败。谁能解释编译器用来选择它将使用的构造函数的逻辑,以及为什么它无法编译?

如果我认为在其他情况下被调用的构造函数是错误的,你能否指出被调用的内容,为什么?

0 投票
2 回答
195 浏览

c++ - 为什么 std::in_place_t 的构造函数默认且显式?

cppreference 显示以下定义std::in_place_t

为什么他们添加了一个explicit默认构造函数?为什么它没有被排除在外?有什么好处?

0 投票
0 回答
334 浏览

c++ - C++隐式定义特殊函数

在当前版本的 C++ 草案(2019 年 9 月)中,第[class.default.ctor]/4段指出:

一个默认且未定义为已删除的默认构造函数在使用 odr ([basic.def.odr]) 创建其类类型 ([intro.object]) 的对象时隐式定义常量求值([expr.const]),或者在第一次声明后显式默认。[...]。在隐式定义类的默认默认构造函数之前,应隐式定义其基类及其非静态数据成员的所有非用户提供的默认构造函数。[注意:隐式声明的默认构造函数具有异常规范([except.spec])。显式默认定义可能具有隐式异常规范,请参阅 [dcl.fct.def]。——尾注]

[class.dtor]/11为默认析构函数指定了类似的限制。

突出显示的句子是什么意思?是对程序还是对实现(编译器)的限制?

引用段落的第一句说明了默认的默认构造函数何时被隐式定义(例如,当它被使用时)。如果突出显示的句子是对程序的限制,那么下面的例子应该是错误的,因为在(1)处,默认的默认构造函数B是 odr-used,因此它是隐式定义的。但是,此时,默认的默认构造函数A还没有被隐式定义,因此突出显示的句子中的限制不受尊重。这是因为我相信只有在定义A了默认的默认构造函数之后,才会使用默认的默认构造B函数。这个假设是错误的吗?

谢谢你。

0 投票
2 回答
97 浏览

c++ - 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?

仅在GCCClang中测试,基类中存在按值传递的复制赋值运算符(在实现复制和交换(或复制和移动)习语时很有用)导致复制赋值运算符在要隐式删除的派生类。

Clang 和 GCC 对此表示同意;为什么会这样?

示例代码:

0 投票
1 回答
300 浏览

c++ - 为什么 C++20 允许默认比较即使被删除也可以编译?

考虑以下代码:

clang 给出了一个很好的警告:

警告:显式默认的相等比较运算符被隐式删除 [-Wdefaulted-function-deleted] bool operator == (const B& other) const = default;

但我想知道为什么这个代码甚至被标准接受。我假设如果有人operator ==在他的非模板结构/类中默认了,他的意图是永远不会被删除operator ==

但这是具有一百万个极端情况的 C++,因此可能有充分的理由。也许不是特殊情况模板?

但是clang足够聪明,不会对这段代码发出警告......

...所以理论上标准可以做同样的事情。

0 投票
0 回答
98 浏览

c++ - 如果特殊成员函数使用 typedefs 可以默认吗?

Clang 编译得很好,但是 GCC 和 MSVC 抱怨不能operator=默认:

这段代码合法吗?如果不是,如果Me被定义为是否合法typedef S Me;