C++ 非依赖名称查找和lambda

C++ 非依赖名称查找和lambda,c++,c++11,templates,lambda,language-lawyer,C++,C++11,Templates,Lambda,Language Lawyer,我有以下代码: template <class T> class Outer { public: Outer(); template <class U> void templateFunc() { } private: class Inner { public: Inner(Outer& outer) { outer.templateFunc

我有以下代码:

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;
}

但是,g++-5.4和g++-6.3可以很好地编译这段代码。因此,g++-7.2似乎将lambda中的
outer_ptr
类型视为一个从属名称,我无法理解为什么。有人能给我解释一下吗?

是的,这是一个gcc回归。归档为

下面是一个简化的示例:

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

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

int main() { }
模板
结构外部
{
模板
无效f();
空心钢筋(外部){
[outer](){outer.f();};
}
};
int main(){}

outer.f
是的成员访问权限,因此表达式不应算作,因此您不需要提供
模板
关键字

考虑到以前的gcc接受它,我猜它确实是一个bug。所以它可能是g++-7.2?中的bug?。当直接使用注入的类名时,捕获的变量将不会编译。doesI不确定这是否是一个bug。。。谢谢你的回答!您似乎是一个熟悉某个标准的人,因此可能不难澄清相关问题:在中,有一个链接指向另一个so,其中指出lambda可能在其封闭模板类/函数实例化之前被部分实例化。这可能会以某种方式放松lambda依赖类型的规则吗?事实上,我相信我误解了上述问题的答案中所写的内容-它是关于泛型lambda通过封闭类/函数的实例化部分实例化的,而不是之前。
template <class T>
struct Outer
{
    template <class U>
    void f();

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

int main() { }