如何解决C ++中的顶级是什么?
在example 14 under [dcl.init.list]
中,在缩小转换的范围内,当使用列表初始化描述代码的语义时,该标准使用术语“顶级”。我不知道这是什么意思。
int f(int a) { return 1;}
int main() {
int a[] = {f(2),f(2.0)};
int b[] = {f(2.0),f(2)}; // No error because: double-to-int conversion is not at the top-level
}
我也尝试了以下方法。我发现这与初始化顺序无关:
int f(int a) { return 1;}
int main() {
int a[] = {f(2),f(2)}; // double-to-int conversion is not at the top-level
//int c[] = {f(2147483645.0f),f(2)}; // This is erroring out due to narrowing.
int d[] = {f(2),f(2.0)}; // Now I'm sure top-level doesn't mean the order of initialization.
}
我对这个词感到好奇是因为我试图了解隐式调用缩小转换时列表初始化器何时起作用。
我也不确定术语。例如,是否存在诸如顶级类,顶级类型或顶级列表初始化器之类的东西?
解决方法
这不是严格定义的术语。但是在您链接的[dcl.init.list]/note-7
中,“在顶层”似乎意味着“直接在括号列表中编写,而不是在嵌套表达式中编写”。
因此,在int x[] = {1.0,f(2.0)};
中,1.0
在顶层,因为它直接写在括号列表中,但是2.0
不是因为它嵌套在函数调用表达式中。
这不是严格定义的C ++标准术语。相反,它只是在草率的英语意义上表示。您可以想象有人在使用其他短语,例如“函数中的较早版本”或“相应的头文件”,这些短语在技术上不是C ++术语,但会被广泛理解。
在这种情况下,它们指的是更高级别的嵌套。例如,考虑以下代码段:
void foo() {
int j[2][2] = {{3,4},{5,6}};
}
显然4
比{3,4}
嵌套更深,而{{3,6}}
比{{3,6}}
嵌套得更多。实际上,foo
根本没有嵌套。您阅读的文字的作者将其称为“顶级”。
另一位作者可能会争辩说k = "racecarannakayak"
palin = [] # to get palindrome strs
i,j = 0,2
while j != len(k) + 1:
if k[i:j] == k[:j][::-1]:
palin.append(k[i:j])
i += 1
j += 1
print(palin)
在“最高级别”上,因此在一定程度上取决于上下文。在您发布的报价单中,含义很清楚。
这只是一个英语短语,意在上下文中。
[dcl.init.list]
的规则告诉我们列表初始化器中的项目如何不涉及缩小转换。注意7继续提醒我们这一点,使用术语“顶级”来描述它正在谈论的那些事情(列表的直接“成员”)。
您要参考的示例14还包括一个示例,其中带有列表初始化的语句恰好包含缩小的转换,但是该注释提醒我们,这很好,因为转换发生在“较低级别” ”,再次使用术语“顶层”来描述立即在初始化程序列表中列出的实体。无需将缩小的转换应用于实际的列表项。
“顶级”一词没有正式定义;在考虑游戏中可能的嵌套时,应该以英语含义来解释它。
,前一阵子我对此感到困惑,但是我想我现在已经很了解这个概念了。
在我解释这个概念之前,必须注意,不是顶层或底层的对象,而是顶层或底层的“ const”取决于它在表达式或上下文中的位置。
顶级 const意味着(即)“ const” 使对象本身成为const(无论对象指向什么)。
低级 const表示“ const” 表示被引用(/指向)的对象是const。
例如。
const int i = 10; // const is indicating that i itself is const so it (const) is top level.
const int const *p = &i; // leftmost const is indicating that "pointed to" is const,so that const is low-level,other const in the expr is top-level.
此外,顶层const可以与任何obj类型一起出现(内置类型,类类型,指针类型),而底层const可以在复合类型的基本类型中出现,例如指针&refs。
在指针中,低级和顶级都可以出现,但是在refs中,const始终是低级的,因为refs隐式具有顶级consts(一旦初始化,refs就不能绑定到其他objs ,因此从某种意义上讲,它们隐含了顶级const)。
希望有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。