命名嵌套类时无法解析 lambda 中的名称

Unable To Resolve Name In Lambda When Naming Nested Class

本文关键字:lambda 嵌套      更新时间:2023-10-16

我正在使用MSVC10。

我有一个嵌套在类B中的类C,而类又嵌套在类A中。 B有一个类型为 C 的成员变量,AvectorB s。 这样:

class A
{
  class B
  {
    string foo_;
    class C
    {
      string bar_;
    } c_;
  };
  vector<B> b_;
};

A中,我有一个成员函数,它将for_each与 lambda 一起使用,以迭代vector<B>

在该lambda中,我尝试获取对BC的引用(分别):

void A::Run()
{
    for_each(b_.begin(), b_.end(), [](std::vector<B>::value_type& that)
    {
        const B& b = that;
        cout << b.foo_;
        const B::C& c = b.c_;   //  'B' : is not a class or namespace name
        // const A::B::C& c = b.c_; <-- THIS COMPILES
        cout << c.bar_;
    });
}

代码:const B::C& c = b.c_;会导致编译器错误,"'B':不是类或命名空间名称",即使编译器接受const B& b = that;也没有问题

语言是否允许此语法?

如果我将其更改为:const A::B::C& c = b.c_;编译器接受它。

这里有一个完整的示例供您使用:

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void foo() {}
class A
{
public: 
    void Run();
    struct B
    {
        std::string foo_;
        struct C
        {
            std::string bar_;
        } c_;
    };
    std::vector<B> b_;
};
void A::Run()
{
    for_each(b_.begin(), b_.end(), [](std::vector<B>::value_type& that)
    {
        const B& b = that;
        cout << b.foo_;
        const B::C& c = b.c_;   //  'B' : is not a class or namespace name
        // const A::B::C& c = b.c_; <-- THIS COMPILES
        cout << c.bar_;
    });
}
int main()
{
    A a;
    a.Run();
}

这是编译器中的一个错误。该代码使用 MSVC 2012 RC 编译良好。我相信相关的错误是这个。

该标准的相关部分是 [expr.prim.lambda] 5.1.2 条款 7:

lambda 表达式的复合语句产生函数体 (8.4) 的函数调用运算符,但用于名称查找 (3.4),确定此(9.3.2)的类型和值并转换 将非静态类成员引用为类成员的 id 表达式 使用 (*this) (9.3.1) 访问表达式,复合语句为 在 lambda 表达式的上下文中考虑。