从右值引用到基的构造函数-可行(gcc)或不可行(clang)-谁是对的

ŁukaszWojakowski

如以下代码段所示,最近出现了一个兼容问题:

struct Base
{
};

template<typename T>
struct A : Base
{
    A(){}
    A(Base&&) {}
};

A<int> foo()
{
    A<double> v;
    return v;
}


int main()
{
    auto d = foo();
    return 0;
}

Gcc表示还可以,但clang表示不同意,并说“候选构造函数不可行:对于第一个参数A(Base &&){},没有从'A'到'Base &&'的已知转换”,请自己看看:https : //godbolt.org / z / Y7mwnU

任何一种读者都可以通过一些标准语言来支持这两种观点吗?

巴里

铛在这里是正确的。提起87530

返回语句的规则为[class.copy.elision] / 3

在以下复制初始化上下文中,可以使用移动操作代替复制操作:

  • 如果return语句([stmt.return])中的表达式是一个(可能带括号的)id表达式,该对象使用在最里面的封闭函数或lambda-expression的主体或参数声明子句声明的自动存储持续时间来命名对象,要么
  • 如果throw-expression的操作数是非易失性自动对象(函数或catch子句参数除外)的名称,则其范围不会超出最里面的try块的末尾(如果有) ,

首先执行重载决议为副本选择构造函数,就好像该对象是由右值指定的一样。如果第一个重载解析失败或没有执行,或者所选构造函数的第一个参数的类型不是对该对象类型的右值引用(可能是cv限定),则再次执行重载解析,将对象视为左值。[注意:无论是否出现复制省略,都必须执行此两阶段重载解决方案。如果不执行省略操作,它将确定要调用的构造函数,并且即使取消了调用,所选的构造函数也必须可访问。—尾注]

强调我的。

我们遇到了第一个项目符号,我们返回一个ID表达式,该表达式命名了一个非易失性自动对象。因此,我们执行重载解析,就好像它是一个右值一样。此重载解析成功,有一个采用的构造函数Base&&但是,请注意粗体部分。此参数的类型不是对该对象类型的右值引用。

因此,我们再次尝试将对象视为左值。此重载解决方案失败。

结果,程序格式不正确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

clang错误:注意:候选构造函数(隐式move构造函数)不可行:

来自分类Dev

C ++候选函数不可行?

来自分类Dev

C++ 默认复制构造函数不可行

来自分类Dev

聚合类和不可行的构造函数模板

来自分类Dev

为什么我得到“候选构造函数不可行”?

来自分类Dev

候选构造函数(隐式复制构造函数)不可行:第一个参数需要左值

来自分类Dev

JUCE-成员函数不可行:“此”参数的类型为const

来自分类Dev

C ++:混淆可变参数模板,导致“候选函数不可行”错误

来自分类Dev

候选函数不可行:没有从std :: vector <derived>到std :: vector <base>的转换

来自分类Dev

模板化线性代数向量类中的奇怪“成员函数不可行”错误

来自分类Dev

C++ - 候选函数不可行:没有已知的从“struct”到“struct (&)”的转换

来自分类Dev

selectInput值未在可反应的Shiny中更新(麻烦的绑定不可行)

来自分类Dev

C ++ lambda转换-为什么候选构造函数不可行:没有已知的从lambda到std :: function的转换

来自分类Dev

C ++:没有用于初始化的匹配构造函数/候选构造函数不可行:需要单个参数,但未提供任何参数

来自分类Dev

clang,gcc和忽略的限定词:谁是对的?

来自分类Dev

GCC接受constexpr struct {} s;但Clang拒绝了。谁是正确的?

来自分类Dev

C++:候选函数不可行:第一个参数没有从“Segment [2]”到“int *”的已知转换

来自分类Dev

不可行的解决方案,绝对可行 - CPLEX

来自分类Dev

需要重塑以避免不可行

来自分类Dev

找出Pyomo模型不可行的原因

来自分类Dev

Cplex产生负面或不可行的结果

来自分类Dev

为什么 gurobi 模型不可行?

来自分类Dev

由于问题不可行,纸浆获得结果,而问题不可行

来自分类Dev

如何知道优化问题不可行?Pyomo警告:问题可能不可行

来自分类Dev

在这里,谁是正确的,GCC还是MSVC?

来自分类Dev

谁是Objective-C中NSObject的基类?

来自分类Dev

我怎么知道谁是js函数的调用者?

来自分类Dev

谁是JS(对象或函数)中最父级的实体?

来自分类Dev

具有不变的非constexpr参数的constexpr:谁是正确的,是clang还是gcc?

Related 相关文章

  1. 1

    clang错误:注意:候选构造函数(隐式move构造函数)不可行:

  2. 2

    C ++候选函数不可行?

  3. 3

    C++ 默认复制构造函数不可行

  4. 4

    聚合类和不可行的构造函数模板

  5. 5

    为什么我得到“候选构造函数不可行”?

  6. 6

    候选构造函数(隐式复制构造函数)不可行:第一个参数需要左值

  7. 7

    JUCE-成员函数不可行:“此”参数的类型为const

  8. 8

    C ++:混淆可变参数模板,导致“候选函数不可行”错误

  9. 9

    候选函数不可行:没有从std :: vector <derived>到std :: vector <base>的转换

  10. 10

    模板化线性代数向量类中的奇怪“成员函数不可行”错误

  11. 11

    C++ - 候选函数不可行:没有已知的从“struct”到“struct (&)”的转换

  12. 12

    selectInput值未在可反应的Shiny中更新(麻烦的绑定不可行)

  13. 13

    C ++ lambda转换-为什么候选构造函数不可行:没有已知的从lambda到std :: function的转换

  14. 14

    C ++:没有用于初始化的匹配构造函数/候选构造函数不可行:需要单个参数,但未提供任何参数

  15. 15

    clang,gcc和忽略的限定词:谁是对的?

  16. 16

    GCC接受constexpr struct {} s;但Clang拒绝了。谁是正确的?

  17. 17

    C++:候选函数不可行:第一个参数没有从“Segment [2]”到“int *”的已知转换

  18. 18

    不可行的解决方案,绝对可行 - CPLEX

  19. 19

    需要重塑以避免不可行

  20. 20

    找出Pyomo模型不可行的原因

  21. 21

    Cplex产生负面或不可行的结果

  22. 22

    为什么 gurobi 模型不可行?

  23. 23

    由于问题不可行,纸浆获得结果,而问题不可行

  24. 24

    如何知道优化问题不可行?Pyomo警告:问题可能不可行

  25. 25

    在这里,谁是正确的,GCC还是MSVC?

  26. 26

    谁是Objective-C中NSObject的基类?

  27. 27

    我怎么知道谁是js函数的调用者?

  28. 28

    谁是JS(对象或函数)中最父级的实体?

  29. 29

    具有不变的非constexpr参数的constexpr:谁是正确的,是clang还是gcc?

热门标签

归档