【问题标题】:comparison of two auto variables两个自动变量的比较
【发布时间】:2016-06-29 12:36:35
【问题描述】:
#include <iostream>

using namespace std;

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

为什么上面的 C++ 代码在使用 c++11 标准的 g++ 编译器中返回错误,而不是打印“等于”作为输出?

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

【问题讨论】:

  • 为我工作。 ideone.com/TdnlY5
  • 哪种错误?
  • 使用什么编译器?什么版本?构建时使用了哪些标志?更重要的是,您会遇到什么错误?请将它们逐字复制粘贴到问题的正文中。
  • 您的编译器的auto 已耗尽燃料。它需要更新

标签: c++11 initialization


【解决方案1】:

你怎么看:

auto a{1};

是编译器?

如果你认为它应该是整数,那你就错了。编译器在确定事物是什么方面很懒惰,它是 initializer_list (正如您的错误所述)并且 std::initializer_list 没有定义 == 运算符(正如您的编译器所述)

【讨论】:

  • 问题出在编译器已经过时,我更新了它,它工作得很好
  • 我不认为这是编译器问题,很可能较新的版本提供了快捷方式。例如我使用 VS 2015,它给了我和你一样的错误,所以代码维护很可能会出现问题
  • 这是不正确的。来自 cppreference:如果括号初始化列表只有一个元素,并且 T 不是引用类型或者是与元素类型不兼容的引用类型,则 T 被直接初始化(直接-list-initialization)或复制初始化(在复制列表初始化中),但不允许缩小转换。
  • @erip - 当T 是已知类型时,你是对的; int a{1} 之类的东西;但是当您写auto a{1} 时,您必须确定T,所以(如果我没记错的话;请注意我的话)您的规则不适用并且a 成为std::initializer_list跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多