Как правильно инициализировать Struct в C ++ - PullRequest
0 голосов
/ 02 мая 2019

В настоящее время сталкиваюсь с проблемой с этим вопросом в моей домашней работе.Я считаю, что только 4,7 неверны (в Visual Studio они не выдают ошибку).Но я честно не уверен, почему они единственные.Так как 3 работы, я предположил, что они будут работать, но это не так.Любой совет?

struct A {
    double x;
    A(double x = 1) : x(x) { }
};

struct B {
    double x;
    B(A a = 2.0) : x(a.x) { }
};

struct C {
    double x;
    C(B b = B(3)) : x(b.x) { }
};

int main() {
    A a; // (1)
    A a = 4; // (2)
    B b; // (3)
    B b = 5; // (4)
    B b(a); // (5) (a is an object of class A)
    C c; // (6)
    C c = 6.0; // (7)
    C c(a); // (8) (a is an object of class A)
    C c(b); // (9) (b is an object of class B)
}

Правильные:

а) 1-3

б) 1-3,5,9

в)1-6,8,9

г) 1-7

д) 1-3,5,6,9

е) нет

Мои рассуждения:

1) Правильно, просто конструктор по умолчанию

2) Правильно, конструктор по умолчанию или значение (4)

3) Правильно, конструктор по умолчанию

4) Неверно, нет конструктора для целого

5) Правильно, существует конструктор для объекта типа A

6) Правильно, по умолчанию

7) Неверно, так же, как4

8) В этом я не уверен, конструктора для объектов типа A нет, поэтому я бы сказал, что он некорректен

9) Правильно, конструктор существует.

Это мои рассуждения в любом случае, но я не уверен, где я ошибаюсь.

1 Ответ

6 голосов
/ 02 мая 2019

Правило заключается в том, что при преобразовании из типа в другой (здесь / из int, double, A, B или C): только один пользователь- при условии преобразования можно использовать .

Это действительно делает B b = 5; // (4) недействительным, поскольку 5 (int) должно быть:

  • преобразовано в double (первое стандартное преобразование ),
  • затем A (сначала пользовательское преобразование ),
  • затем в B (второе пользовательское преобразование ).

Последний нарушает правило, и эта последовательность преобразования недопустима.

Я, честно говоря, не уверен, почему они [неверны].

Вы можете использовать это правило для проверки других выражений.


Наконец, вы можете произвести впечатление на своего учителя: std::is_convertible:

std::is_convertible_v<B, C> возвращает true если B конвертируется в C ( демо ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...