我只是在玩 C++11 中的新 std::function,我写了一个使用 clang++ 3.2 和英特尔 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 和英特尔 C++ 编译了它而 gcc 没有。
编辑:gcc 在传递 map 仿函数或函数指针时也不会编译相同的代码:
struct {
int operator() (int a) {
return a+2;
}
} add2s;
map(v, add2s);
int add2 (int a) {
return a+2;
}
map(v,add2);
clang 和 icpc 也编译这两个。