【问题标题】:Adding the two integers but one declared as an "int" and other as "auto"?添加两个整数,但一个声明为“int”,另一个声明为“auto”?
【发布时间】:2026-01-16 23:30:01
【问题描述】:

我正在尝试查找数组中所有元素的总和,并使用auto 将我的初始累加器变量sum 声明为0

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n;
    auto sum {0};
    cin >> n;
    vector<int> arr(n);
    for(int arr_i = 0;arr_i < n;arr_i++){
        cin >> arr[arr_i];
        sum=sum+arr[arr_i];
     }
     cout<<sum;
     return 0;
}

它给了我一个编译错误。我想知道这有什么问题。

错误:'sum + arr.std::vector<_tp _alloc>::operator[] >(((std::vector::size_type)arr_i))'中的'operator+'不匹配'|

我正在使用带有 gcc 编译器的代码块,并且启用了 C++ 11。

【问题讨论】:

  • auto sum{0} 中,sum 是一个带有一个元素的std::initializer_list&lt;int&gt;0
  • Not reproduced。在启用 C++11 的情况下编译您的代码。
  • @TavianBarnes,不,不是。
  • 你用的是什么编译器?您使用的是什么编译器标志?请将它们添加到帖子中。还要在帖子中添加编译器错误。
  • 它给了我一个编译错误。嗯,什么错误?我们能看到吗?

标签: c++ c++11 auto


【解决方案1】:

在 C++11 中,当你使用

auto sum {0};

sum 的类型为std::initializer_list&lt;int&gt;,并包含一个元素0。这是因为{0} 是一个花括号初始化列表。

使用= 0;(0) 应该适用于您的代码,例如:

auto sum = 0;
auto sum(0);

编辑: 根据 cmets,这不是程序员 usually expected 所做的,因此它必然会在 C++17 中通过 N3922 提案进行更改,该提案已在较新的版本中实现GCC 和 Clang,甚至对于 -std=c++11-std=c++14 per the request of the C++ committee

【讨论】:

  • 在@TavianBarnes 之后重复你没有用 - 这个用户弄错了。
  • @SergeyA 对不起,我听不懂你在说什么?
  • @SergeyA 是的,我在发布答案后就注意到了,所以我改变了我的。我没有抄袭,冷静。 :-) 欢迎您发布正确答案。
  • @SergeyA 你怎么确定这个答案不正确?是的,N3922 是适用于 C++11 及更高版本的 DR,但 OP 可能使用的是未实现 DR 的旧 gcc 版本。
  • @MarcinJędrzejewski 我花了大约 10 次点击来取消阻止该网站使用的所有 javascript。请注意,很多人(包括我,可能还包括 OP)一开始并不知道存在这样的工具,也不应该指望它们会存在。