显式使用main中的构造函数调用作为函数调用参数

时间:2010-12-24 05:21:32

标签: c++ constructor temporary most-vexing-parse

我试图通过以下代码了解主要工作中的显式构造函数调用。

#include<iostream>

using namespace std;

class Dependency1
{
      bool init;
public:
  Dependency1() : init(true) {
    std::cout << "Dependency1 construction"
              << std::endl;
  }
  void print() const {
    std::cout << "Dependency1 init: "
              << init << std::endl;
  }



};


class Dependency2 {
   Dependency1 d1;
public:
   Dependency2(const Dependency1& dep1): d1(dep1){
     std::cout << "Dependency2 construction ";
     print();
   }
   void print() const { d1.print(); }
};

void test( const Dependency1& dd1)
{
    cout  << " inside Test \n";
    dd1.print();
}



int main()
{

    test(Dependency1());
    Dependency2 D1(Dependency1()); // this line does not work

    return 0;
}

正在调用函数测试,其中构造函数 Dependency1()用作函数调用而不是 Dependency1 :: Dependency1()和代码运行得非常好。

现在,如果我使用类似的概念来创建Dependency2的对象D1,它就不起作用了。 似乎我基于错误的理解在这里做错了什么。

需要知道编译器如何在main中解析Dependency1()调用,即使未使用范围解析,以及当我在 Dependency2

谢谢, 阿南德

2 个答案:

答案 0 :(得分:7)

  

test(Dependency1())

这将调用函数test并传递类Dependency1的临时对象。因为test定义中的形式参数是对const的引用,并且因为临时值可以绑定到const引用,所以代码可以正常工作。

  

Dependency2 D1(Dependency1()); // this line does not work

这称为C ++最令人烦恼的解析。 D1被解释为返回Dependency2并将参数作为返回Dependency1函数的指针的函数。

尝试Dependency2 D1((Dependency1()));并查看输出的变化。

注意:增加一对括号会使编译器将(Dependency1())视为表达式。

答案 1 :(得分:1)

Dependency1()创建一个Dependency1类型的临时对象,并将其传递给函数test。