На первый взгляд, первый вызывает конструктор const char*
для инициализации s1
. Второй использует конструктор const char*
для инициализации временного значения, а затем использует конструктор копирования, передавая ссылку на это временное значение, для инициализации s2
.
Тем не менее, стандарт явно разрешает то, что называется "разрешением копирования", что означает, что, как говорит АраК, второе может быть юридически заменено первым , даже если конструктор копирования имеет наблюдаемые побочные эффекты , поэтому что изменение влияет на вывод программы.
Однако, когда эта замена сделана, компилятор все равно должен проверить, что класс имеет доступный конструктор копирования. Таким образом, потенциальная разница в том, что вторая форма требует, чтобы конструктор копирования вызывался, даже если компилятор не должен вызывать его. Очевидно, у std::string
есть такой, так что в этом случае это не имеет значения, но для других классов это может быть.