我遇到了一些非常奇怪的g ++行为,并希望得到一些帮助。 所以我想提出三个几乎相似的代码:
class Foo
{
public:
template<typename T = char>
bool Moo(std::function<bool()> f = [](){ return true; }) const
{
std::string str2 = "Text\n with\tsome \t whitespaces\n\n";
str2.erase(std::remove_if(str2.begin(), str2.end(),
[](char x){return true;}), str2.end());
// just to do something
f = 0;
return f();
};
};
int main(int argc, char **args)
{
Foo* myFoo = new Foo();
return myFoo->Moo<>();
}
这将产生3个错误:
现在,如果我们将Moo的参数更改为一个简单的类型或,如果我们取出函数体内的lambda(通过用“str.erase”取出整行)代码编译没有错误!
将参数更改为普通类型:
class Foo
{
public:
template<typename T = char>
bool Moo(bool f = true) const
{
std::string str2 = "Text\n with\tsome \t whitespaces\n\n";
str2.erase(std::remove_if(str2.begin(), str2.end(),
[](char x){return true;}), str2.end());
// just to do something
f = 0;
return f;
};
};
int main(int argc, char **args)
{
Foo* myFoo = new Foo();
return myFoo->Moo<>();
}
使用“str.erase”删除该行:
class Foo
{
public:
template<typename T = char>
bool Moo(std::function<bool()> f = [](){ return true; }) const
{
std::string str2 = "Text\n with\tsome \t whitespaces\n\n";
// just to do something
f = 0;
return f();
};
};
int main(int argc, char **args)
{
Foo* myFoo = new Foo();
return myFoo->Moo<>();
}
那么这里发生了什么?为什么函数体(“str.erase”行)中的“remove_if-lambda”和函数参数列表中的“defaulta-lambda函数”的组合会产生关于函数头中“默认模板参数”的错误?
答案 0 :(得分:0)
所以我可以结束这个问题并确认问题:
上面的(第一个)代码示例不能在g ++ - 4.8.1,g ++ - 4.8.2和g ++ - 4.9上编译。 它 在clang ++ 3.2-7ubuntu1上编译。因此,我没有看到任何语法错误称这是gcc中的错误。
我已将错误报告为错误59944:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59944
编辑: 从那以后,这个bug已经在gcc 4.9.2
中修复了