【问题标题】:Why no constructors are called? [duplicate]为什么不调用构造函数? [复制]
【发布时间】:2021-02-18 09:53:27
【问题描述】:

这里 C() 是一个临时对象,应该使用无参数构造函数创建,然后我希望调用移动构造函数。然而它们都没有发生。谁能解释一下为什么?

#include <iostream>

using namespace std;
class C{
    public:
        C(){std::cout<<"No arg\n";}
        C(const C& r){std:cout<<"Copy Cons\n";}
        C(C&& r){std:cout<<"Move Cons\n";}
};

int main() {
    C c(C());
}

【问题讨论】:

  • @Nicol 实际上是最麻烦的解析。 OP 的期望仍然是错误的,但他们会合理地期望默认 ctor 至少一次。
  • 关闭原因错误(或仅部分错误)。这是最令人头疼的解析。 stackoverflow.com/questions/5926103/most-vexing-parse
  • @Bathsheba 您认为的欺骗目标是否缺少某些东西?
  • @Bathsheba 这很公平,但欺骗目标涵盖了您的答案,对吧?
  • 只有 dup 不同,它不是同一类型,但我怀疑差异是否显着

标签: c++ constructor move-constructor temporary-objects


【解决方案1】:

C c(C()); 语句实际上是一个名为 c 的函数的函数声明,它返回 C 并将函数(未命名)作为参数,该函数返回 C 并且不带任何参数。

换句话说,它是纯声明性的,对程序没有影响。

这是most vexing parse 的示例。

即使我们修复了这个问题(使用C c((C()))C c{C()}),C++17 之前的大多数编译器使用该语言授予的权限来优化“额外”临时对象(并且从 C++17 they must do so),所以您最多只能看到单个默认构造函数调用的输出。

【讨论】:

  • 我们在 C++ 中称它们为 声明,而不是原型(它们是微妙不同的东西)
  • @AsteroidsWithWings:这是一个 wiki 答案 - 让我们一起编辑吧。
  • 你直接走进了那个...
  • @cigien 不,因为“欺骗目标”没有提到,甚至一次都没有提到调用移动 ctor 或复制 ctor 的期望。因此,您所指的解释与其他问题完全无关。这就是为什么这不是重复的。我们可以放松并高兴地看到这个 OP 对他们的问题有一个很好的、完整的答案吗?还有更重要的事情需要担心。
  • @Bathsheba 忽略我之前的评论,我没有正确考虑这个问题。我现在看到您的回答澄清了 OP 的误解,并且至少在这方面很有用,即使根本原因已包含在欺骗目标中。感谢您努力写出答案。
猜你喜欢
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2012-02-28
  • 2015-06-10
  • 2012-06-28
相关资源
最近更新 更多