【发布时间】:2013-03-30 10:17:54
【问题描述】:
我只是在玩 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 没有。
编辑:当传递 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 也可以编译这两者。
【问题讨论】:
-
什么错误,g++ 告诉你?
-
clang 3.0 with -std=c++11 crash dumps on this code
-
'main()::<lambda(int)>' is not derived from 'std::function<typename C::value_type(typename C::value_type)>'我想,这至少是我得到的。 -
@AndyProwl,你就在那里不应该进行任何类型推导,因为
function<typename C::value_type(typename C::value_type)>是一个非推导上下文,但由于某种原因失败了,但是它适用于std::function<int(int)>,应该是等效的。有关详细信息,请参阅 bugzilla 报告。 -
@JonathanWakely:感谢您再次澄清。您的回答清楚地表明,更改本身仅有助于揭示现有的错误,而不是成为罪魁祸首。 (已经 +1)