Допустим, у нас есть класс Custom String, который выглядит следующим образом
using namespace std;
class CustomStr {
public:
const char* s;
// converting constructor
CustomStr(const char* s) : s (s) {
cout << "Constructor called" << endl;
}
// Copy constructor
CustomStr(const CustomStr& cs) : s (cs.s) {
cout << "Copy Constructor called" << endl;
}
};
Давайте рассмотрим следующий код:
int main() {
CustomStr cs("Some char pointer");
CustomStr cs_copy = cs;
return 0;
}
В вышеприведенном случае мы ожидаем, что сначала будет вызван конвертирующий конструктор, а после этого будет вызван конструктор копирования для CustomStr cs_copy = cs
, и мы получим соответствующий вывод, как и ожидалось
$ ./a.out
Constructor called
Copy Constructor called
Теперь рассмотрим следующий код
int main() {
CustomStr cs_copy = CustomStr("Some char pointer");
return 0;
}
В этом случае я также подумал, что нужно сделать 2 вызова конструктора - преобразовать вызов конструктора для CustomStr("Some char pointer")
и скопировать вызов конструктора для CustomStr cs_copy = CustomStr("Some char pointer")
. Но вывод показывает только вызываемый конструктор преобразования.
Я не смог объяснить, как это происходило. Я ожидал, что компилятор оптимизирует работу, но я хотел понять, в каких случаях эта оптимизация запускается.