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

时间:2014-01-25 16:53:37

标签: c++ templates c++11 lambda

我遇到了一些非常奇怪的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”和函数参数列表中的“defaulta-lambda函数”的组合会产生关于函数头中“默认模板参数”的错误?

1 个答案:

答案 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

中修复了