为什么我不能使用" initializer_list" as" normal"变量?
代码:
void stovr(int a){}
int main() {
auto v {5}; // v is std::initializer_list<int>
stovr(v); // cannot convert 'std::initializer_list<int>' to 'int'
}
v
是列表)))v
是list
而不是int
?答案 0 :(得分:6)
std::initializer_list<T>
无法转换为T
,T[]
无法转换为T
, vector<T>
无法转换为T
:如果您只知道自己有std::initializer_list<T>
,则不知道它有多少元素。
std::initializer_list<int> x = { 1, 2, 3 };
完全有效。如果存在从std::initializer_list<int>
到int
的隐式转换,您希望看到哪些值?
答案 1 :(得分:1)
&#34;支持的初始化程序没有类型!支撑初始化器没有类型!一个 支撑初始化器没有类型!没有类型对应 支持初始化程序&#34;
(C)Scott Meyers。
这就是为什么带有一个元素的大括号初始化器的自动类型推导无法遵循C ++ 11和C ++ 14中的直观规则。
许多程序员认为它是标准的缺陷。这就是提案N3922: New Rules for auto deduction from braced-init-list存在的原因。值得注意的是:
直接列表初始化:
- 对于只包含单个元素的braced-init-list,自动扣除将从该条目中推断出来;
- 对于包含多个元素的braced-init-list,自动扣除将会格式不正确。
不确定这是否是一个重大改变,并且在此之后所有C ++ 14代码都会工作。
来源:关于CppCon关于C ++ 11 / C ++ 14 / C ++ 17中类型演绎的怪癖的一篇很好的演讲由Scott Meyers撰写:link,包括大括号初始化器自动类型演绎(从29:00开始)。在他的新book中有更多详细信息(同时也有一个免费的采样器)