我正在测试新功能 https://stackoverflow.com/questions/25879705/is-auto-as-a-parameter-in-a-regular-function-a-gcc-4-9-extension对于 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
I get:
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*
and make_unique<int>(42)
。然而,向量是会产生错误的。
我不认为范围类型可以通过这种方式推断出来 – sp2danny
我相信使用auto
就像这样调用旧的auto
meaning
(据我所知,在这种情况下auto
=int
, and int
无法转换为std::vector http://www.cplusplus.com/reference/vector/vector/vector/).
目前它可以在 lambda 中使用
[](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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)