gpt4 book ai didi

c++ - lambdas 的调用操作符是否需要链接?

转载 作者:太空狗 更新时间:2023-10-29 21:12:56 28 4
gpt4 key购买 nike

我有一些处理函数地址、lambdas 和模板参数的代码。

这是一个片段,向我展示了这些地址对函数的一些用法:

#include <type_traits>

int main() {
auto l = []{};
using L = decltype(l);

// fine, am I just lucky?
using type1 = std::integral_constant<decltype(&L::operator()), &L::operator()>;

struct Bar {
static void baz() {}
};

// error!
using type2 = std::integral_constant<decltype(&Bar::baz), &Bar::baz>;
}

问题是,为了能够将 &Bar::baz 作为模板参数发送,它必须具有链接,因此会出现错误。

为什么 lambda 案例有效?是因为它不是静态的还是因为lambda的调用运算符有链接?

最佳答案

lambda 的闭包类型是一个未命名的类,参见 [expr.prim.lambda.closure]/1 .类的成员函数与其包含类的名称具有相同的链接(如果有的话);见[basic.link]/5 .如果包含类没有名称(甚至连链接的目的都没有),那么它的成员函数就没有链接。

此外,局部lambda的闭包类型是局部类,而局部类,即使是有名字的类,也没有任何联系;见[expr.prim.lambda.closure]/2[basic.link]/8 .

在 C++17 之前,链接要求,在 [temp.arg.nontype]/1.3 中找到, 适用于指针和引用,但不适用于指向成员的指针。根据这些规则,GCC 接受您的 lambda 案例并拒绝您的 Bar::baz 案例是正确的。

N4268完全删除了 C++17 的链接要求,同时修改了模板非类型参数的规则。在 C++17 中,这两个示例都应该被接受。

关于c++ - lambdas 的调用操作符是否需要链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824686/

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