Какие преобразования выполняет конструктор преобразования, если объект создан и ему присвоено значение? - PullRequest
4 голосов
/ 19 мая 2019

Если у меня есть класс с конструктором, подобным этому:

class A {
public:
    A(int e) {
      // Use the `e` value
    }
};

И если я звоню вот так:

int main() {
  A obj = 'c';
}

Какие преобразования будут иметь место? Произойдет ли сначала преобразование в тип A, а затем как оно передается в конструктор? Или значение символа будет преобразовано в int?

Кроме того, какие преобразования здесь блокируются объявлением конструктора явным?


Чтобы прояснить мои сомнения:

Если я объявлю конструктор как explicit, я увижу эти результаты:

int main() {
  A objA = 'x';   // Error: conversion from ‘char’ to non-scalar type ‘A’ requested
  A objA('x');    // OK
  A objA = 1;     // Error: conversion from ‘int’ to non-scalar type ‘A’ requested

  A objA = A(1);  // OK: Constructor called explicitly
  A objA = (A)1;  // OK: type Casting
}

Я не понимаю поведение в первых трех утверждениях. Почему первый и третий операторы преобразуются в тип A, а не в int в первом? Почему второй оператор компилируется, хотя существует неявное преобразование из char в int?

1 Ответ

1 голос
/ 19 мая 2019
A obj = 'c';
A obj = 1;

Они называются copy-initialization . В этом случае рассматриваются только конвертирующие конструкторы (т.е. неявные конструкторы), которые принимают один аргумент, при этом единственным является

A(int e)
{
  // ...
}

'c' (char) преобразуется в int и затем передается выбранному конструктору в качестве аргумента.

Если вы объявите конструктор как explicit, то он не будет конструктором преобразования, и copy-initialization не сможет найти подходящий конструктор преобразования, что сделает программу некорректной.


A obj('c');
A obj{'c'}; // since C++11
A obj(1);

A(1);
(A)1;

Они называются прямой инициализацией . В этом случае рассматриваются все конструкторы (в том числе явные). Следовательно, независимо от того, объявляете ли вы конструктор явным или нет, конструктор вызывается.

...