2016-06-29 2 views
0
#include <iostream> 

using namespace std; 

int main() 
{ 
    auto a{1}; 
    auto b{1}; 
    if (a==b) 
    { 
     cout << "equal"; 
    } 
    return 0; 
} 

Почему приведенный выше код на C++ возвращает ошибку в компиляторе g ++ со стандартом C++ 11 вместо того, чтобы печатать «равный» как вывод?сравнение двух автоматических переменных

test.cpp:9:14: error: no match for ‘operator==’ (operand types are ‘std::initializer_list’ and ‘std::initializer_list’) if (a==b) ^

+1

Работает для меня. http://ideone.com/TdnlY5 – erip

+2

Какая ошибка? – soon

+2

С помощью какого компилятора? Какая версия? Какие флаги использовались при строительстве? И что еще более важно, * какие ошибки вы получаете *? Скопируйте их дословно в тело вопроса. –

ответ

3

Что вы думаете:

auto a{1}; 

является компилятор?

Если вы считаете, что это должно быть целым, вы ошибаетесь. Компиляторы ленивы в определении того, что есть, и это initializer_list (как и ваша ошибка). std::initializer_list не имеет оператора == (как указано вашим компилятором)

+0

проблема была с компилятором, который был устаревшим, я обновил его, и он отлично работает –

+0

Я не думаю, что это проблема компилятора, скорее всего, более новые из них обеспечивают ярлык. Например, я использую VS 2015, и он дает мне ту же ошибку, что и у вас, поэтому, скорее всего, будут проблемы с обслуживанием кода. – MaciekGrynda

+0

Это неверно. Из cppreference: _ Если список braced-init-list имеет только один элемент и либо T не является ссылочным типом, либо является ссылочным типом, который несовместим с типом элемента, T является прямым инициализированным (в direct-list- инициализация) или копирование-инициализация (в инициализации списка копий), за исключением того, что сужение конверсий не допускается. – erip

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