簡體   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