gpt4 book ai didi

c++ - Lambda 表达式、共享指针和 this 的类型

转载 作者:行者123 更新时间:2023-11-30 00:46:49 25 4
gpt4 key购买 nike

考虑以下代码:

#include <memory>
#include <cassert>

struct S: std::enable_shared_from_this<S> {
protected:
S() = default;

int bar() { return 42; }
};

struct T: S {
static std::shared_ptr<T> create() {
return std::shared_ptr<T>(new T{});
}

auto foo() {
auto ptr = std::static_pointer_cast<T>(shared_from_this());
return [ptr](){ return ptr->bar(); };
}

private:
T() = default;
};

int main() {
std::shared_ptr<T> ptr = T::create();
auto lambda = ptr->foo();
assert(lambda() == 42);
}

上面的代码可以编译。如果方法 foo 被修改如下:

auto foo() {
// In this case, there is no explicit cast
// The type of ptr is no longer std::shared_ptr<T>
// It is std::shared_ptr<S> instead
auto ptr = shared_from_this();
return [ptr](){ return ptr->bar(); };
}

在这种情况下,代码不再编译(无论是使用 GCC 还是使用 clang)。

显然它会在转换后编译(这就是我在第一个示例中所做的),但我希望即使在这种情况下 bar 对 lambda 也是可见的,因为它在其S 的上下文和部分接口(interface)。

我怀疑这是由于 5.1.5p8 ,特别是:

The lambda-expression's compound-statement yields the function-body [...] of the function call operator, but for [...], determining the type and value of this [...], the compound-statement is considered in the context of the lambda-expression.

其实clang返回的错误已经很明确了:

main.cpp:8:9: note: can only access this member on an object of type T

我的推论对吗?
是否由于上述段落,从而导致 this 指针的确定类型问题与共享指针之一不匹配?

shared_ptr 参与游戏的事实让我有点难以理解。
老实说,我希望这两个示例都能编译或都失败。

最佳答案

看来您只是违反了 protected 访问的基本规则。 IE。整个事情与 lambdas 或共享指针无关。从一开始就存在的 protected 访问的古老规则说,基类的 protected 成员只能通过派生类的对象访问。与您上面所说的相反,在您的上下文中,S 的 protected 成员无法通过 S 类型的对象访问,但可以通过 T< 类型的对象访问.

整个事情可以通过下面的简单例子来简化

struct S
{
protected:
int i;
};

struct T : S
{
void foo()
{
this->i = 5; // OK, access through `T`

T t;
t.i = 5; // OK, access through `T`

S s;
s.i = 5; // ERROR: access through `S`, inaccessible

S *ps = this;
ps->i = 5; // ERROR: access through `S`, inaccessible
}
};

关于c++ - Lambda 表达式、共享指针和 this 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37144183/

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