По умолчанию и значения построенные объекты имеют разные типы

Рассмотрим следующий код с построением одной переменной по умолчанию и построением другого значения:

#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,c и b имеют разные типы, хотя они ссылаются на одну и ту же структуру / класс. Как это может быть?

(Конечно, это минимальный пример, полученный из проблемы сложного кода. Там я получаю что-то вроде A против A(int), но я не могу воспроизвести это пока.)

0
задан Erwin411 26 June 2019 в 23:14
поделиться

1 ответ

Объявление A b() означает, что b является функцией сигнатуры A (), несмотря на то, что она смешана с объявлениями переменных a и c типа 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)

Таким образом, a и b являются значениями по умолчанию и значения построены, соответственно, но c является объявлением функции и, следовательно, другого типа.

0
ответ дан Erwin411 26 June 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: