gpt4 book ai didi

c++ - 在括号内的 lambda 中声明名称为 `this` 的变量会在 3 个不同的编译器上产生不同的结果

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

在 C++ 中,可以在括号内声明变量,例如 int (x) = 0;。但似乎如果您使用 this 而不是变量名,则使用构造函数代替:A (this); 调用 A::A(B*) 。那么第一个问题就是为什么this不一样,是不是因为变量不能命名为this?让事情变得复杂一点,让我们把 this 放在 lambda 中 -

struct B;
struct A
{
A (B *) {}
};

struct B
{
B ()
{
[this] { A (this); } ();
}
};

现在 gcc 调用 A::A(B*),msvc 打印关于缺少默认构造函数的错误,clang 打印 expected expression ( https://godbolt.org/g/Vxe0fF )。它在 msvc 中甚至更有趣 - 它确实创建了名称为 this 的变量,您可以使用它,所以它绝对是一个错误 (https://godbolt.org/g/iQaaPH)。哪个编译器是正确的,出现这种行为的原因是什么?

最佳答案

在 C++ 标准 §5.1.5(C++11 的第 7 条,后面的标准第 8 条)中 [expr.prim.lambda]:

The lambda-expression’s compound-statement yields the function-body (8.4) of the function call operator, but for purposes of name lookup (3.4), determining the type and value of this (9.2.2.1) and transforming id- expressions referring to non-static class members into class member access expressions using (*this) (9.2.2), the compound-statement is considered in the context of the lambda-expression. [ Example:

struct S1 {
int x, y;
int operator()(int);
void f() {
[=]()->int {
return operator()(this->x + y); // equivalent to S1::operator()(this->x + (*this).y)
// this has type S1*
};
}
};

— end example ]

因此,gcc 是正确的。您会注意到,您正在捕获 this 这一事实也不异常(exception)。然而,在捕获 *this 的情况下,它们是自 C++14 以来的精度,仍在 §5.1.5(第 17 条)中:

If *this is captured by copy, each odr-use of this is transformed into a pointer to the corresponding unnamed data member of the closure type, cast (5.4) to the type of this.

关于c++ - 在括号内的 lambda 中声明名称为 `this` 的变量会在 3 个不同的编译器上产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42528917/

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