По умолчанию и значения построенные объекты имеют разные типы - PullRequest
0 голосов
/ 27 июня 2019

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

#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), но не могу воспроизвести этоеще.)

1 Ответ

0 голосов
/ 27 июня 2019

Объявление 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 является объявлением функции и, следовательно, другого типа.

...