gpt4 book ai didi

C++11 g++ 奇怪(使用默认模板、lambda 和 remove_if)

转载 作者:太空狗 更新时间:2023-10-29 23:16:56 25 4
gpt4 key购买 nike

我遇到了一些非常奇怪的 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 个错误:

  • 包含‘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 = "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”和函数参数列表中的“defaulted-lambda 函数”的组合会产生关于函数头中“默认模板参数”的错误?

最佳答案

所以我可以关闭问题并确认问题:

以上(第一个)代码示例无法在 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

编辑:这个错误已经在 gcc 4.9.2 中得到修复

关于C++11 g++ 奇怪(使用默认模板、lambda 和 remove_if),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com