0

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

#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,cb尽管它们引用相同的结构/类,但它们具有不同的类型。怎么会这样?

(当然,这是一个从复杂代码问题派生的最小示例。在那里,我得到了类似Avs的东西,A(int)但我还不能重现它。)

4

1 回答 1

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 (X)

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

于 2019-06-27T09:52:05.793 回答