gpt4 book ai didi

c++ - 左值衰减为右值并出现自动错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:20 26 4
gpt4 key购买 nike

如果问题标题不准确,我深表歉意 - 但我很难理解这里发生的事情。

考虑以下类:

struct foo {
foo(foo&);
};

以下没有错误:

void func(foo& f) {
foo bar{f};
}

但是,当我使用自动时:

void func(foo& f) {
auto bar = foo{f};
}

我得到(gcc):

test.cpp: In function ‘void func(foo&)’:
test.cpp:6:21: error: no matching function for call to ‘foo::foo(foo)’
test.cpp:6:21: note: candidate is:
test.cpp:2:5: note: foo::foo(foo&)
test.cpp:2:5: note: no known conversion for argument 1 from ‘foo’ to ‘foo&’

( clang )

test.cpp:6:10: error: no matching constructor for initialization of 'bar'
auto bar = foo{f};
^ ~~~~~~
test.cpp:2:5: note: candidate constructor not viable: expects an l-value for 1st argument
foo(foo&);
^

有人可以解释为什么这是一个错误吗?

谢谢!

编辑:如果我向 foo 添加一个复制构造函数,它就会工作。但是,我的印象是“=”语法右侧的变量声明+对构造函数的显式调用被特殊处理,不是复制构造而是直接初始化。

最佳答案

auto bar = foo{f};

auto 被推断为 foo。随后,您的定义等同于

foo bar = foo{f};

您正在尝试创建类型为 foo 的对象,该对象使用纯右值 foo{f} 进行复制初始化。

问题是 foo 的复制构造函数有一个非 const 左值引用作为它的参数,它不可能绑定(bind)到一个右值。此外,移动构造函数不是隐式定义的,因为您有一个用户声明的复制构造函数。因此,没有可以采用 foo{f} 的构造函数,并且编译器会发出一条错误消息。

关于c++ - 左值衰减为右值并出现自动错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27491907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com