2013-09-11 3 views
2

Если я разорву, строка testfn вызывает ошибку компиляции. Какой конструктор я могу добавить с помощью =default, чтобы я мог определить прокладку комментариев и использовать TestFn()? Помните, что t{a} также должен работать (не показано ниже).конструктор по умолчанию для элемента init?

struct Test2 { 
    int a; int*p; 
    Test2()=default; 
    //Test2(int a, int b, int c){}; 
}; 
void TestFn() { Test2 t{5,nullptr}; } 
+0

Я думаю, вы можете получить больше ответов на полезные комментарии для своих последних двух вопросов, если вы помечаете их как C++. – juanchopanza

ответ

5

То же самое происходит, если вы явно определяете Test2() {}.

Эта форма инициализации называется инициализацией агрегата, и она применяется только в том случае, если нет определенных пользователем конструкторов. Он не проходит через какой-либо конструктор, а инициализирует элементы непосредственно из списка инициализаторов. Поэтому нет ничего дефолта; вы должны явно определить любые конструкторы, которые вы хотите.

На самом деле я немного удивлен, что конструктор с явно дефолтом не отключает агрегатную инициализацию. Согласно @juachopanza, C++ 11 был специально сформулирован, что агрегатная инициализация зависит от определения , что позволяет конкретно объявлять .

+0

В C++ 11 было внесено изменение в формулировку соответствующего раздела стандарта, от «объявленного пользователем конструктора» до «предоставленного пользователем конструктора». Это позволяет использовать конструктор по умолчанию в сводном типе, поскольку он не считается «предоставленным пользователем». IIRC ни C++ 03, ни C++ 11 не упоминают конструкторы, определяемые пользователем, в этом контексте. – juanchopanza

+0

@juanchopanza Спасибо, добавлено в ответ. – Potatoswatter

+0

Итак, я не могу сказать, что я дал стандартную реализацию агрегатной инициализации? Это немного плохо, учитывая, что мы можем использовать '= default' для многих других конструкторов. +1, но не принято bc Я надеюсь, что это возможно (C++ 14 ??) –

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