C++ 为什么结构化绑定不会与变量发生潜在冲突

C++ 为什么结构化绑定不会与变量发生潜在冲突,c++,language-lawyer,c++20,C++,Language Lawyer,C++20,最新标准已修改为添加P1787的内容。关于可能发生冲突的两个声明的一条规则是: 如果两个声明对应,并导致它们的共享名表示不同的实体([basic.link]),则可能会发生冲突 我不知道这里“不同实体”的意思。是指这些实体有不同的种类,还是指它们是由不同的实体决定的?实体有以下几种: 实体是值、对象、引用、结构化绑定、函数、枚举数、类型、类成员、位字段、模板、模板专用化、命名空间或包 比如说, void fun()//#1. 外景娱乐//#2. int main(){} 如果“不同实体”一词是

最新标准已修改为添加P1787的内容。关于可能发生冲突的两个声明的一条规则是:

如果两个声明对应,并导致它们的共享名表示不同的实体([basic.link]),则可能会发生冲突

我不知道这里“不同实体”的意思。是指这些实体有不同的种类,还是指它们是由不同的实体决定的?实体有以下几种:

实体是值、对象、引用、结构化绑定、函数、枚举数、类型、类成员、位字段、模板、模板专用化、命名空间或包

比如说,

void fun()//#1.
外景娱乐//#2.
int main(){}
如果“不同实体”一词是指前者,那么#1表示函数#2表示变量,它们是不同类型的实体。并且这两个声明在同一范围内,因此根据:

如果在任何范围内,一个名称绑定到两个可能冲突且一个在另一个之前的声明,则程序是格式错误的

但是,如果
不同实体
应由[basic.link#8]确定,而不是根据实体的种类确定。那么,这也是有道理的。因为,根据[basic.link#8]

两个实体声明声明同一实体,如果考虑到未命名类型的声明以引入它们的名称用于链接,如果有([dcl.typedef],[dcl.enum]),它们对应([basic.scope.scope]),具有相同的目标作用域,而不是函数或模板参数作用域,则

  • 它们出现在同一翻译单元中,或
  • 它们都使用模块链接声明名称并附加到同一模块,或者
  • 它们都使用外部链接声明名称
因为它们是对应的,并且具有相同的目标范围,并且满足项目符号1或项目符号3。因此,
#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]的规则?