是否允许矢量<auto>? (错误:无效使用'auto')

时间:2017-01-24 20:52:15

标签: c++ c++11 vector auto

我有:

#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
   auto a = -SOME_CONST_MAX;
   vector<auto> myVec {a, a, a, a};
}

我不知道SOME_CONST_MAX的类型,但我想制作-SOME_CONST_MAX类型的向量。我假设vector<auto>会起作用,因为它会从a的类型中推断出来。

我正在运行这些错误: g++ -std=c++14 main.cpp

main.cpp:9:9: error: invalid use of ‘auto’
  vector<auto> myVec {a, a, a, a};
         ^
main.cpp:9:13: error: template argument 1 is invalid
  vector<auto> myVec {a, a, a, a};
             ^
main.cpp:9:13: error: template argument 2 is invalid
main.cpp:9:32: error: scalar object ‘myVec’ requires one element in initializer
  vector<auto> myVec {a, a, a, a};
                                ^

不允许vector<auto>?我做错了什么?

2 个答案:

答案 0 :(得分:10)

我发现Slava的解决方案非常简单和优雅

vector<decltype(a)> myVec {a, a, a, a};

但是,只是为了显示另一种方式,使用可变参数模板函数

template <typename T, typename ... Ts>
std::vector<T> getVect (T const & t, Ts const & ... ts)
 { return { t, ts... } ; }

您可以再次使用auto

auto myVec = getVect(a, a, a, a, a);

答案 1 :(得分:7)

如果我没记错的话,已经针对vector<auto>语法提出了建议。它们不被C ++标准委员会接受。

C ++ 17将引入类似std::vector bob = {a,a,a,a};之类的东西。请注意缺少<auto>。这可能只是语言功能,之后会在std中实际使用。

auto也会添加到模板中,但auto 始终是值永远不是类型。因此,使用auto替换类型被认为是一个坏主意。

以下是模板中auto的用法:

template<auto x>
using constant_t=std::integral_constant<decltype(x),x>;
template<auto x>
constexpr constant_t<x> constant{};

现在constant<7>std::integral_constant<int,7>。出于多种原因,这被认为是有用的。

使用当前C ++解决实际问题的答案是:

auto a = -SOME_CONST_MAX;
std::vector<decltype(a)> myVec {a, a, a, a};

我们推断a的类型并将其传递给vector