【问题标题】:Using conversion constructor implicitly requires copy constructor使用转换构造函数隐式需要复制构造函数
【发布时间】:2011-11-03 02:03:11
【问题描述】:

我正在学习 C++,但遇到了一些奇怪的事情,我在我的 C++ 书籍或网络上找不到任何信息。下面的代码只是对转换构造函数的测试:Test(int)。 testFunction 在需要 Test 对象的地方获得一个 int,并且转换构造函数用于创建一个 Test 对象以发送到函数。这按预期工作。

#include <iostream>
using namespace std;

class subClass {
public:
  subClass(int);
  subClass(subClass&);
};

subClass::subClass(int i) {};
subClass::subClass(subClass& i) {};

class Test {
public:
  Test(const Test&);
  Test(int);
  subClass sub;
};

Test::Test(const Test &)
  : sub(1) {};

Test::Test(int in)
  : sub(1) {};

void testFunction(Test in) {
  cout << "testfunction\n";
};

int main () {

  testFunction(4);
}

但是,如果我从 Test 类中删除复制构造函数 Test(const Test&),则会收到如下所示的错误消息。但是从不使用复制构造函数,那么为什么需要它呢?

example.cpp: In function `int main()':
example.cpp:32: error: no matching function for call to `Test::Test(Test)'
example.cpp:13: note: candidates are: Test::Test(Test&)
example.cpp:24: note:                 Test::Test(int)
example.cpp:32: error:   initializing argument 1 of `void testFunction(Test)' from result of `Test::Test(int)'

附加信息: 我注意到,无论是从子类中删除复制构造函数还是通过引用 testFunction 传递参数,都可以在没有 Test 的复制构造函数的情况下编译函数。我在 cygwin 中使用 gnu g++ 编译器。

【问题讨论】:

    标签: c++ constructor copy-constructor


    【解决方案1】:

    因为:

    void testFunction(Test in)
    

    您通过调用复制构造函数的值传递Test 对象。

    【讨论】:

    • 从复制构造函数添加一行打印输出表明它没有被调用。
    • @snowape 这可能是因为在代码生成时,由于返回值优化,复制构造函数被省略了。然而,RVO 并没有改变复制构造函数必须在编译时可用的事实。这是我最好的猜测。
    • 对不起,我在回答的时候并没有真正关注main(),我只是看到错误在抱怨什么。我同意迈克尔关于它实际上没有被调用的原因。
    • 是的,关闭省略表示调用了复制构造函数
    【解决方案2】:

    问题的另一种解释:
    如果从 Test 类中删除复制构造函数 Test(const Test&amp;) ,您必须打算使用编译器生成的复制构造函数,它将调用subClass sub 的复制构造函数。但是您将其定义为subClass(subClass&amp;),不符合约定。所以如果你把它改成subClass(const subClass&amp;),你现在就可以删除Test(const Test&amp;)了。

    【讨论】:

    • 感谢您提供更多信息。现在我看到了子类是如何参与的。
    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2023-03-22
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多