我只是在尝试使用C++11中的新std::function,并编写了一个例子,它可以与clang++ 3.2和Intel C++编译器13.1一起编译,但无法与g++ 4.8一起编译。在我报告此问题之前,我想检查一下自己是否做了什么非常愚蠢的事情,以及这个代码片段是否应该编译通过。 那么,以下代码是否有效的C++11代码?
template <typename C>
void map(C& c, std::function<typename C::value_type(typename C::value_type)> f)
{
for(auto& x : c) {
x = f(x);
}
}
int main()
{
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
map(v, [](int x) { return x+2; });
for(auto x : v) {
std::cout << x << std::endl;
}
}
我意识到这段代码并不是很有用,但令我感到奇怪的是,clang和Intel C++编译了它,而gcc没有。
编辑:当传递map一个函数对象或函数指针时,gcc也无法编译相同的代码:
struct {
int operator() (int a) {
return a+2;
}
} add2s;
map(v, add2s);
int add2 (int a) {
return a+2;
}
map(v,add2);
clang和icpc也都可以编译这两个。
function<typename C::value_type(typename C::value_type)>
是一个非推导上下文,但出于某些原因它会失败,但使用std::function<int(int)>
就可以正常工作,而这两者应该是等价的。更多详情请参见 bugzilla 报告。 - Jonathan Wakely