我遇到了一些非常奇怪的g ++行爲,並希望得到一些幫助。 所以我想在座三人幾乎類似的代碼片段:C++ 11 g ++奇怪(使用默認模板,lambda和remove_if)
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個錯誤:對於類封閉「富::武(標準模板參數
- 默認參數::功能)const的:: __ lambda1' [](炭X){返回true;})
- 爲調用沒有匹配的函數 '富::武()'
- 模板參數推導/置換失敗
現在,如果我們改變哞的參數,以一個簡單的類型或如果我們拿出函數體內的拉姆達(通過取出整條生產線以「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<>();
}
那麼,什麼是怎麼回事?爲什麼函數體中的「remove_if-lambda」(「str.erase」行)和函數參數列表中的「默認-Lambda函數」的組合會產生關於函數頭中的「默認模板參數」的錯誤?
? IIRC存在與lambda相關的缺陷作爲默認參數.. – dyp
在[clang ++ 3.5 trunk 198621](http://coliru.stacked-crooked.com/a/d71fa6bd5f1f7659)上編譯得很好(並且工作正常) – dyp
我一直在使用g ++ 4.8.1,但是現在我看到了4.8.2,所以我也會嘗試一下,讓你知道。 –