gpt4 book ai didi

c++ - 对成员函数的模糊调用以在 lambda 中捕获 this

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:31 27 4
gpt4 key购买 nike

我在尝试为捕获的 this 调用 lambda 内部的成员函数时遇到了问题。该函数有 const 和非 const 版本,它以类型为​​模板。

下面的代码演示了错误:

struct TEST
{
template <typename T>
void test() {}

template <typename T>
void test() const {}

TEST()
{
[this]()
{
test<void>();
}();
}
};

消息:http://rextester.com/MLU2098

source_file.cpp(13): error C2668: 'TEST::test': ambiguous call to overloaded function
source_file.cpp(7): note: could be 'void TEST::test<void>(void) const'
source_file.cpp(4): note: or 'void TEST::test<void>(void)'
source_file.cpp(13): note: while trying to match the argument list '()'
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

我不确定这种行为是否正确,是否只是 Microsoft 编译器的问题,所以我在编译器资源管理器中使用 gcc 和 clang 测试了代码,它们都编译了代码,没有出现错误。

哪个编译器在这里显示了正确的行为?

最佳答案

这是 MSVC 的问题。隐式 this 参数具有 cv 限定。这就是为什么可以在 cv 限定符上重载成员函数的原因。在c'tor的主体中,this指向一个非常量对象(初始化意味着我们毕竟必须修改对象)。

这足以确定要调用的重载。

无论出于何种原因,MSVC 都感到困惑。但是,如果您通过显式访问 this 指针来调用成员函数,混淆就会消失:

void bar()
{
[this]()
{
this->test<void>();
}();
}

Live MSVC Example

关于c++ - 对成员函数的模糊调用以在 lambda 中捕获 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45862799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com