gpt4 book ai didi

c++ - 如何解决静态方法内部的 lambda 内部的歧义?

转载 作者:太空狗 更新时间:2023-10-29 20:33:02 26 4
gpt4 key购买 nike

我正在尝试编写日志记录功能,如果存在则打印对象 ID。VS 2019 编译并运行良好,但 Clang 失败。如何为 Clang 工作?

注意:“日志”成员可以存在或不存在——取决于类开发人员。它是可选的。全局“日志”变量将始终存在。

简短示例:

int i = 0;

struct S {
int i = 1;

int f() {
return i;
}

static int g() {
return [&](){
return i;
}();
}
};

完整示例

#include <cstdio>
#include <cassert>
#include <string>

using std::string;

#define LOG(x) [&]() \
{ \
log.print(x); \
} \
();

namespace myspace {

class Log
{
public:
Log(string id)
: m_Id(id)
{
}
void print(const string& str)
{
printf("%s %s\n",m_Id.c_str(),str.c_str());
}
private:
string m_Id;
};

Log log("global_id");

class MyClass
{
public:
MyClass()
: log("local_id")
{
}
void doSomething()
{
LOG("doSomething");
}
static void doSomethingStatic()
{
LOG("doSomethingStatic");
}
public:
Log log;

};

void test()
{
MyClass obj;
obj.doSomething();
MyClass::doSomethingStatic();
}

}// ns

int main()
{
myspace::test();
return 0;
}

预期输出(VS 2019,编译成功):

local_id doSomething
global_id doSomethingStatic

实际输出(clang版本8.0.1,编译错误)

main.cpp(46,5): error: invalid use of member 'log' in static member function
main.cpp(10,7): note: expanded from macro 'LOG'

最佳答案

您正在进行不合格的名称查找。标准是这样说的(强调我的):

[basic.lookup.unqual]#1
In all the cases listed in [basic.lookup.unqual], the scopes are searched for a declaration in the order listed in each of the respective categories; name lookup ends as soon as a declaration is found for the name. If no declaration is found, the program is ill-formed.

笔记[class.static.mfct]#1阐明 [class.mfct] 的规则也适用于静态成员函数。这些包括another note这指的是 [basic.unqual.lookup]。

关于lambda中的这个存在,我们可以发现:

[expr.prim.lambda.closure]#12
The lambda-expression's compound-statement yields the function-body ([dcl.fct.def]) of the function call operator, but for purposes of name lookup [...], the compound-statement is considered in the context of the lambda-expression.

换句话说,lambda 函数体中的名称查找就好像我们在周围范围(静态成员函数)中一样,所以上面的内容仍然适用。

cannot通过显式捕获来规避此问题(即 [&log](){...}();),因为

[expr.prim.lambda.capture]
The identifier in a simple-capture is looked up using the usual rules for unqualified name lookup; [...]

最后,它归结为上面的粗体突出显示:一旦找到匹配名称,不合格名称查找就会停止(无论您是否想要该名称)。由于非静态 log 成员是在全局 log 变量之前找到的,因此查找会在此处停止。我不认为你可以解决这个问题,这只是指定非限定查找和(静态)成员函数的工作方式。出于显而易见的原因,限定名称查找(这一次)不是出路。

关于c++ - 如何解决静态方法内部的 lambda 内部的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729362/

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