C ++ 1z обработка теста == с помощью std :: initializer_list & lt; int & gt; с и без const в авто функции

c_NEXT определяется в class AskBase:

struct Status {
static auto constexpr   c_ROOT      {-999};
static auto constexpr   c_PREVIOUS  {-1};
static auto constexpr   c_NEXT      {1};
static auto constexpr   c_EOF       {999};
};

Потом c_NEXT используется в template<typename Container> class AskUI

auto run(){
auto status = AskBase::Status::c_NEXT;
for (typename Container::iterator ii=m_asks.begin();
ii!=m_asks.end();
ii=(AskBase::Status::c_ROOT==status)? m_asks.begin():
(AskBase::Status::c_PREVIOUS==status)?(m_asks.begin()==ii?m_asks.begin():ii-1):
(AskBase::Status::c_NEXT==status)?ii+1:
m_asks.end())
status = (*ii)->ask_user();
return (AskBase::Status::c_NEXT==status);
}

Ссылаясь на три ()? выражения и тому return Заявление Clang ++ сообщает:

error: invalid operands to binary expression ('const std::initializer_list<int>'
and 'std::initializer_list<int>')

Предложения по устранению ошибки.

Используя команду:

clang++ -std=c++1z

0

Решение

С принятие из N3922 на заседании комитета в ноябре 2014 года четыре инициализации в этом вопросе теперь выведут int скорее, чем initializer_list<int>, Бумага делает auto используется в прямой список инициализация контекст (то есть, auto x{/*...*/};) неправильно сформирован, если список не содержит только один элемент, и в этом случае тип выводится непосредственно из этого элемента. копирование списка инициализацияauto x = {/*...*/}; — остается неизменным и выведет std::initializer_list,

Цитирование из примеров, добавленных к стандарту в этой статье:

auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 }; // decltype(x5) is int

Поскольку газета говорит

Руководство EWG заключается в том, что мы считаем это недостатком C ++ 14.

и разработчики компиляторов обычно применяют отчеты о дефектах задним числом, мы могли бы видеть, что это реализовано в режимах компиляторов C ++ 11/14, в дополнение к режиму C ++ 1z (17?).

2

Другие решения

Эффективный Современный C ++ страница 23:

в C ++ 11 программирование случайно объявляет
станд :: initializer_list
переменная
когда вы хотите объявить что-то еще. Эта ловушка является одной из причин
разработчики ставят скобки вокруг своих инициализаторов только тогда, когда они должны.

struct Status {
static auto constexpr   c_ROOT      =-999;
static auto constexpr   c_PREVIOUS  =  -1;
static auto constexpr   c_NEXT      =   1;
static auto constexpr   c_EOF       = 999;
};
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector