[英]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.