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() { }