【问题标题】:What do explicitly-defaulted constructors do?显式默认构造函数有什么作用?
【发布时间】:2015-11-30 20:32:33
【问题描述】:

考虑以下几点:

template <class T>
struct myclass
{
    using value_type = T;
    constexpr myclass() = default;
    constexpr myclass(const myclass& other) = default;
    constexpr myclass(const myclass&& other) = default;
    T value;
};
  • 这些函数对于哪些构造函数是等价的?
  • myclass&lt;int&gt; x; 是否初始化0 处的整数?
  • 对于myclass&lt;std::vector&lt;int&gt;&gt; x;,默认的移动构造函数是做什么的?是否调用向量的移动构造函数?

【问题讨论】:

  • 你的意思是让移动构造函数参数const
  • 我认为constexpr myclass(const myclass&amp;&amp; other) = default; 实际上格式不正确

标签: c++ c++11 constructor default default-constructor


【解决方案1】:

它们不等同于任何函数体。三种情况之间存在细微但显着的差异:= default,允许隐式生成,以及最近的等效函数体。

以下链接有更详细的解释:

我找不到关于复制构造函数的好链接;但是,其他两个链接中提到的类似考虑也将适用。


myclass&lt;int&gt; x; 未将 value 设置为 0

默认的移动构造函数(如果你将其设为非常量引用)会移动每个可移动成员(尽管我认为有一种特殊情况,如果存在不可移动的基类,就会发生奇怪的事情......)

【讨论】:

  • IIRC,如果存在不可移动的基类或非静态数据成员,则显式默认的移动构造函数将被定义为已删除。
  • @Praetorian 你能回答昨天的this question 吗?我无法理解发生了什么,ImplicitDelete 类有一个不可移动的基础,但移动它确实可以编译
  • 我不知道 why 部分,但 OP 的描述是正确的 - [class.copy]/11 - 定义为的默认移动构造函数重载决议忽略了deleted。所以ImplicitDelete 的移动构造函数被重载决议忽略,复制构造函数是下一个可行的候选者,所以移动它会导致复制。
  • @Praetorian 好的,谢谢。因此,删除函数参与重载解析的规则有一个例外.. 很清楚:)
  • @Vincent 是的,我确定。编译器警告无关紧要。尝试输出未初始化的变量会导致未定义的行为,您可能会看到任何内容。参见 C++14 的 [dcl.init]/12
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多