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