2014-12-01 2 views
5

В следующем коде структуры шаблонов 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; 
} 
+1

При задании вопроса об ошибке конкретного компилятора, пожалуйста, укажите полное сообщение об ошибке в вопросе. Это помогает. –

+0

@MarkRansom: Обновлен вопрос. – Hector

+0

@Hector Я принял ваш код дословно, скомпилировал его с помощью Visual Studio 2013 Update 4 и получил только предупреждение: 'warning C4700: неинициализированная локальная переменная 'instance2' used' Она также компилируется без проблем здесь: http: // ideone. com/Hc1jB4 – PaulMcKenzie

ответ

1

В Visual Studio имеется флаг компилятора для обработки предупреждений как ошибок (/ WX). Вы можете отключить этот флаг, чтобы не обрабатывать предупреждения как ошибки. Вы также можете игнорировать определенные предупреждения (/ wd4100, чтобы отключить предупреждение C4100).

Что вы видите, это предупреждение компилятора, которое рассматривается как ошибка.

Это не связано с интерпретацией цитаты из стандарта.

В случае

BB<AA> instance; 

компилятор не выдает предупреждающее сообщение, так как вы могли бы сделать что-то в конструктор, который имеет побочные эффекты. Компилятор предпочитает не вникать в детали того, как реализован конструктор, чтобы определить, имеет ли вызывающий конструктор побочные эффекты или нет.

В случае

CC<AA> instance2; 

он может сделать вывод, что не существует никаких побочных эффектов построения объекта.

+0

В VS 2017 это на самом деле ошибка. Не предупреждение. И я определенно не включил «Обращаться с предупреждениями как ошибки». Все еще отличный ответ. – TobiMcNamobi

+0

@TobiMcNamobi, у меня нет доступа к VS 2017. Надеюсь, вы получите ответ из другого источника. –

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