2016-03-10 3 views
3

У меня есть этот фрагмент кода, который, кажется, работает хорошо:По умолчанию аргумент, используя фигурные скобки инициализатор

class foo{/* some member variables and functions*/}; 
void do_somthing(foo x={}){} 
int main(){ 
    do_somthing(); 
} 

Я имел обыкновение использовать void do_somthing(foo x=foo()){} по умолчанию в x аргумент, но я вижу этот путь ={} в какой-то книге или в Интернете, например (не могу вспомнить). Можно ли это использовать? Есть ли разница между этими двумя методами?

ответ

6

foo x=foo() является copy initialization,

Инициализирует объект из другого объекта

и foo() является value initialization.

Это инициализация, выполняемая, когда переменная сконструирована с пустым инициализатором.

foo x={} является aggregate initialization.

инициализацию агрегата из рамно-инициализации-листа

Если количество инициализатора пунктов меньше, чем число членов и оснований (так как C++, 17) или список инициализатора полностью пусто, остальные члены и базы (начиная с C++ 17) инициализируются их инициализаторами по умолчанию, если они указаны в определении класса, и в противном случае (начиная с C++ 14) пустым списком, который выполняет инициализацию значения.

Таким образом, результат будет таким же в этом случае (оба значения инициализированы).

И эффекты инициализации значения в данном случае являются:

если T является типом класса с конструктором по умолчанию, который не является ни предоставленный пользователем и не удаляется (то есть, это может быть класс с неявно или определяемого по умолчанию конструктор по умолчанию), то объект нулевой инициализируется

Наконец эффекты нулевой инициализации в данном случае являются:

Если Т скалярная тип, начальное значение объекта является интегралом константа равна нулю явно преобразуется в T.

Если T является несрастание тип класса, все базовые классы и не-статические данные члены равны нулю инициализирован, и все padding инициализируется до нуля бит. Конструкторы, если они есть, игнорируются.

Смежные вопросы