问题1:
int v = 10;
auto f = [v = v](){};
考虑上面的代码,该标准中提到的一些规则将适用。
[expr.prim.lambda.capture#6]
An init-capture behaves as if it declares and explicitly captures a variable of the form “auto init-capture ;” whose declarative region is the lambda-expression's compound-statement.
引号意味着
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]
The point of declaration for a name is immediately after its complete declarator and before its initializer (if any) [ Example:
unsigned char x = 12;
{ unsigned char x = x; }
Here the second x is initialized with its own (indeterminate) value. — end example ]
问题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
与 issue 1 相同的问题,当declarator-id的名称与在这些假设的副本初始化上下文中出现的初始化程序中的id表达式的名称相同时,如何解释这些问题。这些假设的副本初始化与规则 [basic.scope.pdecl#1] 相矛盾
题:
我想知道是否在初始化程序中对id表达式的查找早于假设声明的发生?我为什么会这样呢?因为相反,因为在通常的声明期间,初始化程序的查找发生在声明程序立即完成之后,如 [basic.scope.pdecl#1] 中所述,这意味着declarator-id将隐藏id表达式,在初始化器中,如果它们是相同的名称。
标准中是否有引用解释此内容?
最佳答案
[basic.scope.pdecl]中的initializer
引用语法规则的元素,供解析器使用。它在[dlc.init]中定义,并出现在 init-declarator
语法规则中。
对于lambda捕获,标准指定它与init-declarator 等效,但与等效,其声明区域为lambda表达式的复合语句[...],即捕获名称不在范围内初始化程序。
术语initialization
不指代术语initilizer
所指的语法规则。 initialization
是用于初始化变量的表达式求值,这不是语法规则。涉及这两个术语的规则不能冲突,因为它们不属于“编译”->“执行”过程的同一阶段:
1)initializer
,declarator
或init-caputure
等的语法规则用于确定在初始化程序中出现的id表达式(表达式内的名称)指向哪个对象。 id表达式是glvalue。 glvalue指向一个对象,并且没有名称。
2)然后,这些glvalues是执行initialization
的表达式的一部分。进行初始化时,名称无关紧要。
注意:在标准中,许多规则引用语法规则,因此您应该注意格式以便识别它们,因为它们的名称本身没有比在数学方程式内出现的变量的名称更有意义。
关于c++ - 在某些情况下所需的假设声明中的名称查找规则是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62013447/