首页 > 解决方案 > 使用依赖成员初始化程序进行聚合初始化,在 lambda 中实例化

问题描述

标题几乎与在 Visual Studio 上产生错误的最小代码一样长(在 2017 年和 2019 年测试):

#include <string>

struct Foo
{   
    std::string a;
    std::string b{"prefix_" + a};
};


int main()
{
    std::string str{"some string"};
    Foo i{str};

    [str]()
    {
        Foo j{str};
    };
}

在 GCC 和 Clang 上,两个实例化Foo都可以(main 本地,lambda 本地)在 Visual Studio 上,lambda 实例化会导致错误:

error C2326: 'auto main::<lambda_a25bbcbd3e2dc2b2209cfbdd50a2113b>::operator ()(void) const': function cannot access 'j'

如果Foo::b有一个不依赖于 的另一个成员的成员初始化器,Foo则没有错误。我怀疑这就是错误提到访问j(读取j.a到初始化j.b)的原因。

此行为标准是否符合,或者这是 Visual Studio 前端中的错误?

PS:Godbolt 示例https://godbolt.org/z/68zbYx

标签: c++lambdainitialization

解决方案


推荐阅读