非依赖名称查找和lambda

Iva*_*ich 16 c++ lambda templates language-lawyer c++11

我有以下代码:

template <class T>
class Outer
{
public:
    Outer();

    template <class U>
    void templateFunc()
    {
    }

private:
    class Inner
    {
    public:
        Inner(Outer& outer)
        {
            outer.templateFunc<int>();
            Outer* outer_ptr = &outer;
            [outer_ptr]() 
            {
                outer_ptr->templateFunc<int>();
            }();
        }
    };

    Inner m_inner;
};

template <class T>
Outer<T>::Outer()
    : m_inner(*this)
{
}

int main()
{
    Outer<double> outer;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个模板类包含一个嵌套类,它在构造函数中调用其封闭类的一些模板方法.AFAIK,即使封闭类是一个模板类 - 对于嵌套类,它是一个非依赖名称,因此调用其模板方法不template应该是一个问题.当我在嵌套类的构造函数中定义lambda,捕获指向外部类的指针,并尝试调用相同的模板方法时,问题就出现了 - g ++ 7.2给出了以下编译错误:

prog.cc: In lambda function:

prog.cc:22:41: error: expected primary-expression before 'int'
                outer_ptr->templateFunc<int>();
                                        ^~~
prog.cc:22:41: error: expected ';' before 'int'
Run Code Online (Sandbox Code Playgroud)

但是,g ++ - 5.4和g ++ - 6.3编译这段代码就好了.因此,似乎g ++ - 7.2将outer_ptrlambda中的类型视为依赖名称 - 我无法理解为什么.谁可以给我解释一下这个?

Bar*_*rry 2

是的,这是 gcc 回归。归档为82980

这是一个简化的示例:

template <class T>
struct Outer
{
    template <class U>
    void f();

    void bar(Outer outer) {
        [outer](){ outer.f<int>(); };
    }
};

int main() { }
Run Code Online (Sandbox Code Playgroud)

outer.f当前实例化的成员访问权限,因此该表达式不应视为类型相关,因此您不需要提供关键字template