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
С принятие из 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?).
Эффективный Современный 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;
};