0

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 
4

2 回答 2

2

随着N3922在 2014 年 11 月的委员会会议上被采用,问题中的四个初始化现在将推导出int而不是initializer_list<int>. 本文auto直接列表初始化上下文(即auto x{/*...*/};)中使用格式错误,除非列表仅包含一个元素,在这种情况下,类型是直接从该元素推导出来的。copy-list-initialization - 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++1z(17?) 模式之外,我们可能会在 C++11/14 编译器模式中看到这一点。

于 2015-02-22T05:09:38.607 回答
1

有效的现代 C++第 23 页:

在 C++11 编程中,当您打算声明其他内容时,意外声明了 std::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;
};
于 2015-02-21T23:57:15.187 回答