Я пытаюсь понять семантическую разницу между этими двумя способами инициализации:
Foo foo{x};
Foo foo = {x};
Мне интересно узнать разницу в следующих случаях:
-
x
имеет типFoo
. -
Foo
имеет конструктор, который принимает аргумент того же типа, что и для x. -
x
не имеет типаFoo
, но доступен конструктор преобразования. -
x
не имеет типFoo
, но доступен конструктор преобразованияexplicit
.
В различие я имею в виду, в каждом случае:
- Концептуально, какие конструкторы вызываются?
- Какие вызовы конструкторов обычно оптимизируются компилятором?
- Разрешено ли неявное преобразование?