Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在某些上下文中,假设声明中需要哪些名称查找规则_C++_Language Lawyer - Fatal编程技术网

C++ 在某些上下文中,假设声明中需要哪些名称查找规则

C++ 在某些上下文中,假设声明中需要哪些名称查找规则,c++,language-lawyer,C++,Language Lawyer,问题1: intv=10; 自动f=[v=v](){}; 考虑上述代码,标准中提到的一些规则将适用于它 init捕获的行为就好像它声明并显式捕获了一个“auto init capture;”形式的变量,其声明区域是lambda表达式的复合语句 引号表示auto v=v将在lambda的复合语句中声明,就好像它是这样的: //假设代码 int v=10; 自动f=[](){ auto v=v;//第二个'v'是第一个'v',将由一个不确定的值初始化。 }; 因此,对于假设的声明autov=

问题1:

intv=10;
自动f=[v=v](){};
考虑上述代码,标准中提到的一些规则将适用于它

init捕获的行为就好像它声明并显式捕获了一个“auto init capture;”形式的变量,其声明区域是lambda表达式的复合语句

引号表示
auto v=v
将在lambda的复合语句中声明,就好像它是这样的:

//假设代码
int v=10;
自动f=[](){
auto v=v;//第二个'v'是第一个'v',将由一个不确定的值初始化。
}; 
因此,对于假设的声明
autov=v,我认为它将与以下规则冲突

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

问题2:

void func(int v){
int v=0;
func(v);
我们知道函数参数的初始化将发生在调用函数的上下文中,这将是复制初始化。我们忽略标准中的引号,因为它们太多了。因此参数的复制初始化将出现在调用函数上下文中的某个地方,好像它喜欢这样的形式:

//假设代码
int v=v;//在调用函数的上下文中某个地方发生的参数初始化
同样的问题,如问题1,当声明器id的名称与初始值设定项中id表达式的名称相同时,当它们发生在这些假设的副本初始化上下文中时,如何解释这些问题。这些假设的副本初始化是否与规则相矛盾[basic.scope.pdecl#1]

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


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

初始值设定项[basic.scope.pdecl]中的
指语法规则的一个元素,由解析器使用。它在中定义,并出现在语法规则中

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

术语
初始化
不引用术语
初始化器
初始化
引用的语法规则是初始化变量的表达式求值,这不是语法规则。涉及这两个术语的规则不能冲突,因为它们不属于编译的同一阶段在->执行过程中:

1)
初始值设定项
声明项
初始值设定项
等的语法规则用于确定哪个对象引用初始值设定项中出现的id表达式(表达式中的名称)。id表达式是glvalue。glvalue引用对象,但它没有名称

2) 然后,这些值是执行
初始化的表达式的一部分


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

当文本像
那样说
时,您不应该用任意语法替换(即使是最接近意义的语法),然后说语法规则禁止这种替换。@cigien您的意思是这些假设的副本初始化不符合[basic.scope.pdecl#1]在初始值设定项中出现的规则和id表达式的查找比声明符id的查找早?不,我的意思是
auto f=[v=v](){};
-->
auto f=[](){auto v=v;};
不是我认为有效的转换。可能没有规则允许你这样做。@假设程序本身无效,它只是一个假设代码,我问题中的规则说,
好像…
。因此,我想知道当
好像
发生。换句话说,对于
auto f=[v=v](){};
,第二个
v
的查找是否在第一个
v
之前?您还没有解释在lambda的复合语句中定义的假设Declating中,如何通过名称查找规则找到初始值设定项中的名称。:-@jackX…句子“[捕获]声明性区域是lambda表达式的复合语句“意味着捕获只能在lambda闭包调用运算符的函数体中通过名称查找找到:仅在{和}之间.excatly,函数体中声明的变量只能在该范围内找到,非静态数据成员是引用同一实体的另一种方式。我的意思是在“auto init capture;”它在函数体中声明,初始值设定项,即lambda到达作用域中的变量,当它出现在捕获的变量之后时,如何查找名称?@jackX但variab