gpt4 book ai didi

c++ - 无法在 cbegin 中定义 initializer_list

转载 作者:太空狗 更新时间:2023-10-29 21:11:33 25 4
gpt4 key购买 nike

所以我可以这样做:

for(const auto i : { 13, 42 }) cout << i << ' ';

但是我不能这样做:

copy_n(cbegin({ 13, 42 }), 2, ostream_iterator<int>(cout, " "));

它给我错误:

error: no matching function for call to cbegin(<brace-enclosed initializer list>)

关于 for 的是什么? -允许这个但不允许 cbegin 的语句功能?

编辑:

看来问题是我的 initializer_list未被视为 initializer_list ,因为如果我这样做它会起作用:

copy_n(cbegin(initializer_list<int>{ 13, 42 }), 2, ostream_iterator<int>(cout, " "));

Live Example

最佳答案

{ 13, 42 }是花括号初始化列表。它没有类型,它只是一个列表,它取决于它的使用方式和处理方式。 std::cbegin定义如下

template< class C > 
constexpr auto cbegin( const C& c ) -> decltype(std::begin(c));

并且由于花括号初始化器列表没有类型,模板类型推导失败。在基于范围的 for 循环中,我们使用不同的列表。基于 for 循环的范围扩展为

{
init-statement
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}

auto && __range = range_expression ;成为auto && __range = { 13, 42 } .现在auto遵循模板类型推导,除了因为委员会决定 auto should work with braced initializer list , auto将推导出{ 13, 42 }std::initiaizer_list<int>因为列表只包含 int


如果您将代码更改为

copy_n(begin({ 13, 42 }), 2, ostream_iterator<int>(cout, " "));

即使std::begin定义为 cbegin并采用模板类型,<initializer_list> introduces an overload这需要 std::initializer_list它将被调用。

关于c++ - 无法在 cbegin 中定义 initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com