C++11 g++ strangeness(使用默认模板,lambda & remove_if)

C++11 g++ strangeness (using defaulted template, lambda & remove_if)

本文关键字:lambda remove if strangeness g++ 默认 C++11      更新时间:2023-10-16

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

中修复。