我正在测试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)
。但是,矢量是给出错误的。
答案 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;
}