C++11 g++ strangeness(使用默认模板,lambda & remove_if)
C++11 g++ strangeness (using defaulted template, lambda & remove_if)
我遇到了一些非常奇怪的g 行为,并希望有所帮助。因此,我想提出三个几乎相似的代码:
class Foo
{
public:
template<typename T = char>
bool Moo(std::function<bool()> f = [](){ return true; }) const
{
std::string str2 = "Textn withtsome t whitespacesnn";
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个错误:
- 类模板参数的默认参数enclosing``foo :: moo(std :: function)const :: __ lambda1’[] [](char x){return true;})
- 呼叫" foo :: moo()’ 无匹配功能
- 模板参数扣除/替换失败
现在,如果我们将MOO的参数更改为琐碎的类型或,如果我们在功能主体内部取出lambda(通过使用" str.erase"取出整个线),代码编译了代码没有错误!
将参数更改为琐碎类型:
class Foo
{
public:
template<typename T = char>
bool Moo(bool f = true) const
{
std::string str2 = "Textn withtsome t whitespacesnn";
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 = "Textn withtsome t whitespacesnn";
// just to do something
f = 0;
return f();
};
};
int main(int argc, char **args)
{
Foo* myFoo = new Foo();
return myFoo->Moo<>();
}
那么这里发生了什么?为什么在功能主体(" str.erase"行)和函数参数列表中"默认的lambda函数"中的" remove_if-lambda"的组合会在功能标头中产生有关"默认的模板参数"的错误?
,所以我可以关闭问题并确认问题:
上面的(第一个)代码示例未在G -4.8.1,G -4.8.2 Nor G -4.9上编译。它 dis 在clang 3.2-7ubuntu1上编译。因此,我并且没有看到任何句法错误称此为gcc中的错误。
我已将该错误报告为错误59944:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59944
编辑:此后,此错误已在GCC 4.9.2
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- 使用函数"remove"删除重复元素
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- Qt:remove() 和 rmdir() 有什么区别