当前位置: 首页 > 知识库问答 >
问题:

进程引用初始化时是clang中的错误吗

苏志
2023-03-14
#include <iostream>
struct B;
struct A{
  operator B&&() const;
};
struct B{
  B(A const&){

  }
  B() {}
};
int main(){
    A a;
    B&& rf = a;  //#1
}

B g;
A::operator B&&() const {  
    std::cout<<"execute\n";
    return std::move(g);
}

考虑上面的代码,结果在这里。#1处的引用绑定受以下规则约束:

否则,该引用应为对非易失常数类型的左值引用(即cv1应为常数),或该引用应为右值引用。

  • 如果初始化表达式
  • 是右值(但不是位字段)或函数左值,并且"cv1 T1"与"cv2 T2"引用兼容,或
  • 具有类类型(即T2是类类型),其中T1与T2不相关,并且可以转换为右值或函数左值类型cv3 T3,其中cv1 T1与cv3 T3引用兼容(参见[over.match.ref]),

然后,第一种情况下初始值设定项表达式的值和第二种情况下转换的结果被称为转换后的初始值设定项。如果转换的初始值设定项是prvalue,则将其类型T4调整为类型“cv1 T4”([conv.qual]),并应用临时物化转换。在任何情况下,引用都会绑定到生成的glvalue(或相应的基类子对象)。

  • 否则:
  • 如果T1或T2是一个类类型,而T1与T2没有引用关系,则通过用户定义的转换([dcl.init],[over.match.copy],[over.match.conv]),可以使用“cv1 T1”类型的对象的复制初始化规则来考虑用户定义的转换;如果相应的非引用副本初始化格式不正确,则程序格式不正确。然后,调用转换函数的结果(如非引用副本初始化所述)用于直接初始化引用。对于这种直接初始化,不考虑用户定义的转换

根据上述规则的结构,If分支的第二个项目符号对于B就足够了

GCC的结果证明了这些规则所说的,但是Clang抱怨执行引用绑定的转换函数不明确(Clang似乎将各自分支中的两个转换函数都视为候选函数)。是叮当作响的虫子吗?

尽管如此

#include <iostream>
struct B;
struct A{
  operator B&&() const;
};
struct B{
  B(A&){

  }
  B() {}
};
int main(){
    A a;
    B&& rf = a;  //#1
}

B g;
A::operator B&&() const {  
    std::cout<<"execute\n";
    return std::move(g);
}

操作员B仍然同意GCC


共有1个答案

岑元徽
2023-03-14

是的,你选对段落[dcl.init.ref]§5.2.1.2:

否则,该引用应为对非易失常数类型的左值引用(即cv1应为常数),或该引用应为右值引用。

  • 如果初始值设定项表达式
  • 是右值[...]
  • 具有类类型(即T2是类类型),其中T1与T2不相关,并且可以转换为右值或函数左值类型cv3 T3,其中cv1 T1与cv3 T3引用兼容(参见[over.match.ref]),

引用初始化的目的是首先尝试直接绑定(定义在[dcl.init.ref]一节的最后一个规范性语句中,简而言之:当初始值设定项和引用是引用相关的,或者如果有一个转换函数的结果类型是与初始化引用相关的引用时,就会发生直接绑定)。这是一个叮当作响的bug,在标准中肯定不是一个公开的问题。

(可能引起怀疑的站点公开问题(CWG2028)与某些“直接绑定”可能涉及临时物化的事实有关,因此这些情况不应是直接引用绑定,而应是对用户定义转换结果的间接绑定。)

 类似资料:
  • 我有以下Java代码: 但是,当我运行它时,它会抛出以下错误: 我在do之前初始化了变量。while 循环,并在 try. 中设置值。捕获循环。似乎尚未设置该变量。抱歉,如果这是一个相当基本的问题,但我似乎无法弄清楚。

  • 我正在用JPA创建一个Springboot项目。我可以完美地连接到空模式SQL数据库并启动服务器。但是,在SQL数据库中创建表并创建相应的表的和之后,我会得到以下错误:

  • 问题内容: 我是使用log4j软件包的新手,但看不到错误:这是一个非常简单明了的代码示例: 当我尝试编译时,出现此错误: my.package.logging.TestLogger.main(TestLogger.java:15)上的org.apache.logging.log4j.LogManager.getLogger(LogManager.java:129)处的线程“ main”中的java

  • 我正在开发一个Android程序,使用Firebase数据库,但我现在有问题。 这是我的代码主要活动:

  • 我一直在使用Spark2.0.1,但试图通过将tar文件下载到我的本地并更改路径来升级到更新的版本,即2.1.1。 然而,现在当我尝试运行任何程序时,它在初始化SparkContext时都失败了。即。

  • 我在使用FirebaseUI时遇到了麻烦。当我运行我的应用程序时,出现以下问题:“默认FirebaseApp在此进程中未初始化。请确保首先调用FirebaseApp.InitializeApp(上下文)。” 在我的应用程序/构建中。Gradle我有依赖: 、 、 、  我已经将GoogleServices.json导出到“app”文件夹。我别无选择,问题还在继续。有什么建议吗? logcat: -