Стандарт описывает различные виды инициализации, равные 8,5, и эти две, в частности, под 8,5 / 12.
C* b(a); //what does it do?
Это называется прямой инициализацией . Если бы 'b' имел тип класса, то компилятор выполнял бы разрешение перегрузки для конструкторов в C, используя 'a' в качестве аргумента. Для типа указателя, он просто инициализирует «b» с «a».
C* b = a; //is there a difference?
Стандарт считает, что в некоторых случаях они различаются, приведенный выше синтаксис называется copy initialization . Что касается прямой инициализации, поскольку 'b' не является типом класса, то он инициализируется значением 'a'. Если 'a' и 'b' - это один и тот же тип класса, тогда используется прямая инициализация .
Если «b» является типом класса, а «a» имеет другой тип (класс или нет), то правила немного отличаются (8.5 / 14-b1.b3). Так для следующего кода:
C b = a;
Сначала делается попытка преобразовать «a» в тип «C», а затем этот временный объект используется для инициализации «b». Это важно, поскольку вы можете иметь ситуацию, когда прямая инициализация завершается успешно, но копирует инициализацию не удается:
class A {
public:
operator int ();
};
class B {
public:
B (int);
};
void foo ()
{
A a;
B b1 (a); // Succeeds
B b2 = a; // Fails
}