我有:
#include#include using namespace std; int main() { auto a = -SOME_CONST_MAX; vector myVec {a, a, a, a}; }
我不知道它的类型,SOME_CONST_MAX
但我想制作一个类型的矢量-SOME_CONST_MAX
.我认为vector
它会起作用,因为它会从类型中推断出来a
.
我正在运行这些错误:
g++ -std=c++14 main.cpp
main.cpp:9:9: error: invalid use of ‘auto’ vectormyVec {a, a, a, a}; ^ main.cpp:9:13: error: template argument 1 is invalid vector 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 myVec {a, a, a, a}; ^
是vector
不允许的?我究竟做错了什么?
我发现Slava的解决方案非常简单和优雅
vectormyVec {a, a, a, a};
但是,只是为了显示另一种方式,使用可变参数模板函数
templatestd::vector getVect (T const & t, Ts const & ... ts) { return { t, ts... } ; }
你可以variadic
再次使用
auto myVec = getVect(a, a, a, a, a);
如果我没记错的话,已经提出了vector
语法建议.它们不被C++标准委员会接受.
C++ 17将会介绍类似的东西std::vector bob = {a,a,a,a};
.注意缺乏
.这可能只是语言功能,std
后来实际使用.
auto
也被添加到模板,但是auto
是总是一个值从来就不是一个类型.因此,使用auto
替换类型被认为是一个坏主意.
以下是auto
模板中的用法:
templateusing constant_t=std::integral_constant ; template constexpr constant_t constant{};
现在constant<7>
是一个std::integral_constant
.由于许多原因,这被认为是有用的.
使用当前C++解决实际问题的答案是:
auto a = -SOME_CONST_MAX; std::vectormyVec {a, a, a, a};
我们推断出它的类型a
并将其传递给vector
.