繁体   English   中英

标准对lambda类型的命名空间有何看法?

[英]What does the Standard say about the namespace of lambda types?

假设我有这样的设置:

namespace hi {
    template<typename L, typename R> L operator+(L l, R r) {
        // some body
    }
    auto f() {
        return [] {}; // Legal C++14
    }
}
int main() {
    auto x = hi::f();
    1 + x; // Is this legal?
}

问题是lambda类型上的ADL是否会在Standard中找到该命名空间中的重载运算符。

C ++ 11说(5.1.2,p3)lambda的类型将in the smallest block scope, class scope, or namespace scope that contains the corresponding lambda-expression.所以在这种情况下,类型将在f声明。 C ++ 14的CD具有相同的语言。

所以问题实际上是本地类的命名空间是什么。 我不认为它有一个。

C ++ 11,第9.8节,第1节,声明: The name of a local class is local to its enclosing scope. 因此,我不认为它有任何关联的命名空间(根据3.4.2,p2),因此不受ADL的约束。

§3.4.2/ 2说

如果T是类类型(包括联合),则其关联的类是:类本身; 它所属的成员,如果有的话; 及其直接和间接基类。 其关联的名称空间是其关联类是成员的名称空间。

命名空间关联只能穿透一个类嵌套,而不是通过函数作用域,如果这是字面上的。 但Clang和GCC都允许多层次的类嵌套,而GCC也使函数作用域透明化。

在我看来,多层次的类嵌套是一个缺陷,本地类是C ++ 11中的疏忽,因为在C ++ 11之前,没有办法从本地化的命名空间中取出本地类 - 它们不是允许作为模板参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM