C++ 为什么结构化绑定不会与变量发生潜在冲突
最新标准已修改为添加P1787的内容。关于可能发生冲突的两个声明的一条规则是: 如果两个声明对应,并导致它们的共享名表示不同的实体([basic.link]),则可能会发生冲突 我不知道这里“不同实体”的意思。是指这些实体有不同的种类,还是指它们是由不同的实体决定的?实体有以下几种: 实体是值、对象、引用、结构化绑定、函数、枚举数、类型、类成员、位字段、模板、模板专用化、命名空间或包 比如说,C++ 为什么结构化绑定不会与变量发生潜在冲突,c++,language-lawyer,c++20,C++,Language Lawyer,C++20,最新标准已修改为添加P1787的内容。关于可能发生冲突的两个声明的一条规则是: 如果两个声明对应,并导致它们的共享名表示不同的实体([basic.link]),则可能会发生冲突 我不知道这里“不同实体”的意思。是指这些实体有不同的种类,还是指它们是由不同的实体决定的?实体有以下几种: 实体是值、对象、引用、结构化绑定、函数、枚举数、类型、类成员、位字段、模板、模板专用化、命名空间或包 比如说, void fun()//#1. 外景娱乐//#2. int main(){} 如果“不同实体”一词是
void fun()//#1.
外景娱乐//#2.
int main(){}
如果“不同实体”一词是指前者,那么#1表示函数#2表示变量,它们是不同类型的实体。并且这两个声明在同一范围内,因此根据:
如果在任何范围内,一个名称绑定到两个可能冲突且一个在另一个之前的声明,则程序是格式错误的
但是,如果不同实体
应由[basic.link#8]确定,而不是根据实体的种类确定。那么,这也是有道理的。因为,根据[basic.link#8]
两个实体声明声明同一实体,如果考虑到未命名类型的声明以引入它们的名称用于链接,如果有([dcl.typedef],[dcl.enum]),它们对应([basic.scope.scope]),具有相同的目标作用域,而不是函数或模板参数作用域,则
- 它们出现在同一翻译单元中,或
- 它们都使用模块链接声明名称并附加到同一模块,或者
- 它们都使用外部链接声明名称
#1
和#2
是同一个实体。但是,它们违反了以下规则:
对于实体E的任何两个声明:
- 如果一个声明E为变量或函数,另一个应声明E为相同类型的变量或函数
<强>但是,考虑第二个例子
#包括
结构D{
int m;
};
auto[x]=D{0}//#1.
无效显示(){
std::Coutwy为什么“不同的实体”指的是“不同种类的实体”,而不是..嗯..“不同的实体”?除了gcc/clang bug之外,这是怎么回事?两个编译器都会诊断出不存在的示例版本(为什么要允许这样做?)@Barry没有必要确定参数i
和结构化绑定对于您的示例是否是相同的实体。当然,它们不是。这里违反的规则是:如果一个声明的目标范围是lambda表达式、函数体或函数try块的复合语句的块范围s,则pote与目标范围为S的父范围的声明存在本质冲突,程序的格式不正确。@Barry首先,我需要澄清[basic.scope#scope-4]中“不同实体”的概念。换句话说,我们应该按实体类别(例如,函数、类型、变量…)区分措辞或者根据[basic.link/P8]的规则?