Rob*_*son 5 c++ lvalue auto c++11
如果问题标题不准确,我很抱歉 - 但我很难理解这里发生了什么.
考虑以下课程:
struct foo {
foo(foo&);
};
Run Code Online (Sandbox Code Playgroud)
以下没有错误:
void func(foo& f) {
foo bar{f};
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用auto时:
void func(foo& f) {
auto bar = foo{f};
}
Run Code Online (Sandbox Code Playgroud)
我得到(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&’
Run Code Online (Sandbox Code Playgroud)
(铛)
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&);
^
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这是一个错误?
谢谢!
编辑:如果我向foo添加一个拷贝构造函数,它可以工作.但是,我的印象是,'='语法右侧的变量声明+对构造函数的显式调用是专门处理的,不是复制构造,而是直接初始化.
auto bar = foo{f};
Run Code Online (Sandbox Code Playgroud)
auto被推断为foo.随后,您的定义相当于
foo bar = foo{f};
Run Code Online (Sandbox Code Playgroud)
您正在尝试创建foo使用prvalue进行复制初始化 的类型的对象foo{f}.
问题是复制构造函数foo有一个非const左值引用作为参数,这是不可能绑定到右值的.此外,由于您具有用户声明的复制构造函数,因此不会隐式定义移动构造函数.因此,没有构造函数可以采用foo{f},并且编译器发出错误消息.