В следующем коде структуры шаблонов BB и CC практически идентичны, за исключением конструкторов. Шаблон BB использует конструктор, который ничего не делает, тогда как шаблон CC использует конструктор по умолчанию. Когда я скомпилировать его с помощью Visual Studio 2013 обновление 4, выдается ошибка в строке, объявляющего constInst2
, но не на линии, объявляющего constInst
:Неявный конструктор по сравнению с «пустым» конструктором
ошибка C4700: неинициализированный локальную переменную «instance2» используется»
Я ожидал, что та же ошибка при инициализации «экземпляр» а. Могу ли я искажая this sentence?
«Если неявно объявлен конструктор по умолчанию не удаляется или тривиальна, она определена (то есть, функция тела генерируется и компилируется) компилятором, и она имеет точно такой же эффект, как определенный пользователем конструктор с пустым телом и пустым списком инициализатора.»
struct AA
{
typedef int a;
typedef const int b;
};
template< typename A >
struct BB
{
typename A::a a_A;
typedef typename A::b a_B;
BB()
{};
};
template< typename A >
struct CC
{
typename A::a a_A;
typedef typename A::b a_B;
CC() = default;
};
int main()
{
BB<AA> instance;
BB<AA>::a_B constInst(instance.a_A);
CC<AA> instance2;
CC<AA>::a_B constInst2(instance2.a_A);
return 0;
}
При задании вопроса об ошибке конкретного компилятора, пожалуйста, укажите полное сообщение об ошибке в вопросе. Это помогает. –
@MarkRansom: Обновлен вопрос. – Hector
@Hector Я принял ваш код дословно, скомпилировал его с помощью Visual Studio 2013 Update 4 и получил только предупреждение: 'warning C4700: неинициализированная локальная переменная 'instance2' used' Она также компилируется без проблем здесь: http: // ideone. com/Hc1jB4 – PaulMcKenzie