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

时间:2014-10-26 09:31:40

标签: c++ gcc c++14

我正在测试new feature的GCC 4.9(auto参数)并得到一些奇怪的错误。

#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被推导为相同。例如int*make_unique<int>(42)。但是,矢量是给出错误的。

1 个答案:

答案 0 :(得分:0)

  

我不认为参数类型可以推导出来 - sp2danny

我相信使用这样的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;
}