使用auto参数munmap_chunk()返回auto的函数:无效指针

Function returning auto with auto parameter munmap_chunk(): invalid pointer

本文关键字:auto 函数 无效 指针 返回 munmap 参数 chunk 使用      更新时间:2023-10-16

我正在测试GCC 4.9的新功能(参数中的自动),并发现了一些奇怪的错误。

#include <iostream>
#include <vector>
auto foo(auto v)
{
    for (auto&& i : v)
        std::cout << i;
}
int main()
{
    foo(std::vector<int>{1, 2, 3});
}

这给了我以下错误:

*** glibc detected *** ./a.out: munmap_chunk(): invalid pointer: 0x00007f87f58c6dc0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e846)[0x7f87f4e4c846]
./a.out[0x400803]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f87f4def76d]
./a.out[0x400881]

此外,如果我做return 0,我会得到:

main.cpp: In instantiation of 'auto foo(auto:1) [with auto:1 = std::vector<int>]':
main.cpp:13:34:   required from here
main.cpp:8:12: error: could not convert '0' from 'int' to 'std::vector<int>'
     return 0;

似乎奇怪的是,这两辆汽车被推断为相同。我能做些什么来修复?


请注意,以下操作很好:

auto foo(auto v)
{
    return 'a';
}
int main()
{
    char c = foo(42);
}

我的测试似乎表明,指针导致返回类型和v被推导为相同。例如CCD_ 2和CCD_。然而,向量是给出误差的那个。

我不认为参数类型可以这样推导——sp2和任何

我相信像这样使用auto会调用旧的auto,意思是
(AFAIK,在这种情况下auto=int,并且int不能转换为std::vector)。


目前它在lambdas 中工作

[](const auto& v)->void{for(auto&&i:v) std::cout<<i;}

但我认为在这种情况下最好的解决方案是编写一个模板

template<typename T>
void foo(const T& t){
    for (auto&& i : t)
        std::cout << i;
}