gpt4 book ai didi

c++ - ISO C++ 草案 - 3.4.2/3 - 参数相关名称查找

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:35 26 4
gpt4 key购买 nike

ISO C++ 草案 (n3290) 中的一点:

3.4.2/3 Argument Dependant Name Lookup:

Let X be the lookup set produced by unqualified lookup (3.4.1) and let Y be the lookup set produced by argument dependent lookup (defined as follows). If X contains

  • a declaration of a class member (#1) or
  • a block-scope function declaration that is not a using-declaration (#2) or
  • a declaration that is neither a function or a function template (#3)

then Y is empty. Otherwise Y is the set of declarations found in the namespaces associated with the argument types as described below. The set of declarations found by the lookup of the name is the union of X and Y.

是否有演示涉及#1、#2 和#3 的 ADL 的示例代码片段?

最佳答案

我认为这段代码涵盖了所有情况(也可在 http://ideone.com/CbyJv 获得)。如果您不在 ideone 中选择 C++0x,那么情况 #2 是允许的(但 gcc 4.5.2 捕获它)。

#include <iostream>

// ::f
void f (int i) { std::cout << "::f\n" ; }

// Simple case
void OK1() {
f (99) ; // Calls ::f
}

// Argument-dependend lookup
namespace MyNamespace {
struct S { int i ; } ;
void f (S& s) { std::cout << "MyNamespace::f\n" ; }
}

void OK2() {
MyNamespace::S s ;
f (99) ; // Calls ::f
f (s) ; // Calls MyNamespace::f because the type of s is declared in MyNamespace
}

// Declaration of a class member (#1)
struct C {
static void ERROR1() {
MyNamespace::S s ;
f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#1)
}
static void f() { // Declaration of a class member (#1)
std::cout << "C::f\n" ;
}
} ;

// Block-scope function declaration (#2)
void ERROR2() {
void f() ; // Block-scope function declaration (#2)
MyNamespace::S s ;
f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#2)
}

// Declaration that is neither a function or a function template (#3)
void ERROR3() {
MyNamespace::S s ;
f (s) ; // OK: MyNamespace::f called
typedef int f[3] ; // Declaration that is neither a function or a function template (#3)
f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#3). This is an initialiser
}

关于c++ - ISO C++ 草案 - 3.4.2/3 - 参数相关名称查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6922862/

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