除非在未求值的上下文中使用,否则默认参数中不允许使用局部变量



我刚开始使用C++,在一本书中看到了这一行。我不完全理解它的确切含义。有人能简单地举例说明一下它在说什么吗。

我发现了这个链接,但还不太清楚它在说什么

链接:https://en.cppreference.com/w/cpp/language/default_arguments

我们可以使用static变量作为方法和/或函数参数的默认值。

unevaluated可以意味着不从中读取,就像sizeof myVariable一样,其中只获取变量类型的大小(而不是实际值)。

但是,即使使用sizeof myVariable(作为默认参数),也只能从核心语言文字组(又名CWG)的票证2082开始。

您首先需要了解未评估上下文的概念。我没有解释,而是在这里和这里发现了精彩的细节。

简而言之:

换句话说,未赋值的操作数是该语言的某些运算符的操作数。它们在各个方面都是表达式,但从未被评估过。原因是这些运算符只是为了查询其操作数的编译时属性。

例如,sizeof运算符只查询数据类型的大小,不进行求值。

返回回答您最初的问题:

在函数声明中,不能将局部变量(例如n)作为默认参数传递,例如

void f() 
{
int n = 1;
extern void g(int x = n); // error: local variable cannot be a 
}

但是,允许使用未赋值的操作数(例如sizeof),例如:

void f() 
{
int n = 1;
extern void h(int x = sizeof n); // OK as of CWG 2082
}

请注意,n是局部变量,但sizeof在变量n上是未赋值的操作数(在大多数现代机器上,结果将是4字节)。

希望这能有所帮助(附言:我没有声誉可以评论,所以我直接回答)

最新更新