假设声明中某些上下文中需要的名称查找规则是什么

what are name lookup rules within the hypothetical declaration that required in some contexts

本文关键字:查找 规则 是什么 声明 上下文 假设      更新时间:2023-10-16

问题 1:

int v = 10;
auto f = [v = v](){};

考虑上面的代码,标准中提到的一些规则将适用于它。

[expr.prim.lambda.capture#6]

init-capture 的行为就像它声明并显式捕获 "auto init-capture; 形式的变量,其声明区域是 lambda 表达式的复合语句。

引用意味着auto v = v;将在 lambda 的复合语句中声明,就好像它是这样的:

//hypothetical code
int v = 10;
auto f = [](){
auto v = v;  //the second `v` is the first `v` and will be initialized by an indetermined value.
}; 

所以,对于假设的声明auto v = v;,我认为会和以下规则相冲突。

[basic.scope.pdecl#1]

名称的声明点紧接在其完整声明符之后和初始值设定项(如果有(之前 [ 示例:
无符号字符 x = 12;
{ 无符号字符 x = x; }
在这里,第二个 x 使用它自己的(不确定(值进行初始化。 — 结束示例 ]

问题 2:

void func(int v){}  
int v = 0;  
func(v);   

我们知道函数参数的初始化将在调用函数的上下文中进行,并且将是复制初始化。我们忽略了标准中的引号,因为它们太多了。因此,参数的复制初始化将出现在调用函数上下文中的某个地方,就好像它喜欢这样的形式一样:

//hypothetical code
int v = v; // initialization of a parameter that occured in somewhere within context of calling function 

与问题 1 相同的问题,当声明符 id 的名称与初始值设定项中的 id 表达式的名称相同时,如何解释这些问题,当它们发生在这些假设的副本初始化上下文中时。这些假设的副本初始化是否与规则[basic.scope.pdecl#1]相矛盾

问题:

我想知道 在初始值设定项中查找 id 表达式是否早于假设声明发生? 我为什么这么认为? 因为,相反, 在通常的声明中,初始值设定项的查找发生在声明符立即完成后,如[basic.scope.pdecl#1]中所述, 这意味着声明符 id 将隐藏初始值设定项中的 id-表达式,如果它们是相同的名称。

标准中是否有任何引用来解释这一点?

[basic.scope.pdecl] 中的initializer是指解析器使用的语法规则元素。它在 [dlc.init] 中定义,并出现在init-declarator语法规则中。

对于lambda捕获的情况,标准指定它等效于初始化声明器,但其声明区域是lambda表达式的复合语句[...]也就是说捕获名称不在初始值设定项的范围内。

术语initialization不是指术语initilizer所指的语法规则。initialization是初始化变量的表达式计算,但这不是语法规则。涉及这两个术语的规则不能冲突,因为它们不是编译>执行过程的同一阶段的一部分:

1(initializerdeclaratorinit-caputure等的语法规则...用于确定哪个对象引用初始值设定项中显示的 ID 表达式(表达式中的名称(。id-表达式是一个glvalue。glvalue 引用一个对象,它没有名称。

2(那么这些gl值是执行initialization表达式的一部分。进行此初始化时,名称无关紧要。

注意:在标准中,许多规则都引用语法规则,您应该注意格式化以识别它们,因为它们的名称本身并不比数学方程中出现的变量名称更有意义。