默认和值构造的对象具有不同的类型

时间:2019-06-26 23:05:25

标签: default-constructor value-constructor

请考虑以下代码,其中一个变量默认构造,而另一个值构造:

#include <iostream>
#include <typeinfo>

struct A
{
    A() : m_() {}
    A(int m) : m_(m) {}

    int m_;
};

int main()
{
    A a, b(), c(5);

    std::cout << typeid(a).name() << std::endl;
    std::cout << typeid(b).name() << std::endl;
    std::cout << typeid(c).name() << std::endl;

    return 0;
}

对于GCC 4.8,输出为

  

A

     

A()

     

A

尽管a,cb引用相同的结构/类,但它们具有不同的类型。怎么会这样?

(当然,这是从复杂代码问题中衍生出来的一个最小示例。在那里,我得到了AA(int)之类的东西,但是我现在还不能重现。)< / p>

1 个答案:

答案 0 :(得分:0)

声明A b()表示b是签名A ()的函数,尽管它与变量ac的声明混合在一起输入A。对示例代码的以下修改使其更加清晰:

struct X {};

struct A
{
    A() : m_() {}
    A(X m) : m_(m) {}

    X m_;
};

int main()
{
    X x;
    A a, b(x), c(X);

    ...
}

输出为

  

A

     

A

     

A(X)

因此ab是默认值和构造的值,但是c是一个函数声明,因此具有不同的类型。