Если у меня есть класс с конструктором, подобным этому:
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
?