Raj*_*pal 14 c++ declaration c++11
在C++ 0x(哦!读取C++ 11)中,我们有自动类型推断.令我好奇的一件事是我无法创建一系列自动变量.例如:
auto A[] = {1, 2, 3, 4}; // Error!
Run Code Online (Sandbox Code Playgroud)
有什么想法可能被禁止了吗?
pmr*_*pmr 10
auto将每个大括号括起来的初始化列表推断为a std::initializer_list<T>.(参见§7.1.6.4.6,包括示例).不幸的是,你不能初始化数组,甚至std::array从一个std::initializer_list一旦你得到它,但你可以使用std::vector.
#include <vector>
#include <array>
#include <initializer_list>
int main()
{
auto x = {1,2,3};
std::array<int, 3> foo1 = x; // won't work for whatever reason
std::vector<int> foo2 = x; // works as expected
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,这会破坏你想要做的事情的全部目的.
我尝试编写一个调用的工作,make_array但必须意识到这不能工作,因为a的大小initializer_list不是它的模板参数的一部分,所以你只make_array为每个实例化一个模板T.这很糟糕.
template<typename T>
auto make_array(const std::initializer_list<T>& x)
-> std::array<T, x.size()> { } // maaah
Run Code Online (Sandbox Code Playgroud)
好吧,显然你可以选择这里提到的可变参数模板黑客如何用initializer_list初始化一个成员数组?
因为{1, 2, 3, 4}它纯粹是一个句法结构 - 它不是一个表达式,也没有一个类型.因此,auto不能从中推断出它的类型.