C++:使用 auto 将 类 声明为函数内的变量
C++: Using auto to declare classes as variables inside functions
我正在尝试对函数内的所有局部变量使用 auto。
取下面的代码:
class obj
{
public:
obj() {};
obj( obj&& o ) = delete;
};
int main()
{
obj test0;
auto test1 = obj();
return 0;
}
编译代码:
$ g++ --std=c++1z main.cpp
main.cpp: In function ‘int main()’:
main.cpp:13:20: error: use of deleted function ‘obj::obj(obj&&)’
auto test1 = obj();
请注意,定义 test0 完全没问题,但尝试对 test1 进行完全相同类型的声明是编译器错误。显然应该是编译器错误,但在这种情况下,是否意味着 obj 不能用 auto 定义?我 运行 遇到了我无法控制的 QT 对象的问题。
我还在使用 C++98 格式来声明变量,还是有其他使用 auto 的方法?
谢谢!!!
在声明中
auto test1 = obj();
编译器尝试移动 rhs 上的对象,因为它是右值。它不能(因为移动构造函数被标记为已删除)。注意因为move ctor被删除了,那么copy ctor也被删除了,虽然编译器只会尝试移动(因为move ctor,即使被删除,它仍然被认为是用户定义的和it is selected as a candidate during overload resolution) .因此,您的代码无法编译。
这在 C++17 中是可以的;有保证的复制省略调整了规则,这样移动构造函数甚至在概念上都不会被调用,所以它是否被删除或不可访问都没有关系。
在那之前,如果你这么爱auto
,你可以做到
auto&& test1 = obj();
这将创建一个临时 obj
对象并将其绑定到引用 test1
,从而将其生命周期延长至引用的生命周期。除了少数例外,该行为与您在 C++17 中使用纯 auto
.
获得的行为几乎相同
该错误与具体使用 auto
无关。
obj test1 = obj();
也不编译。
obj()
是一个右值,编译器尝试移动它,但移动构造函数被删除。删除移动构造函数也会阻止编译器创建复制构造函数,因此它也无法复制它,因此会出现错误。
我正在尝试对函数内的所有局部变量使用 auto。
取下面的代码:
class obj
{
public:
obj() {};
obj( obj&& o ) = delete;
};
int main()
{
obj test0;
auto test1 = obj();
return 0;
}
编译代码:
$ g++ --std=c++1z main.cpp
main.cpp: In function ‘int main()’:
main.cpp:13:20: error: use of deleted function ‘obj::obj(obj&&)’
auto test1 = obj();
请注意,定义 test0 完全没问题,但尝试对 test1 进行完全相同类型的声明是编译器错误。显然应该是编译器错误,但在这种情况下,是否意味着 obj 不能用 auto 定义?我 运行 遇到了我无法控制的 QT 对象的问题。
我还在使用 C++98 格式来声明变量,还是有其他使用 auto 的方法?
谢谢!!!
在声明中
auto test1 = obj();
编译器尝试移动 rhs 上的对象,因为它是右值。它不能(因为移动构造函数被标记为已删除)。注意因为move ctor被删除了,那么copy ctor也被删除了,虽然编译器只会尝试移动(因为move ctor,即使被删除,它仍然被认为是用户定义的和it is selected as a candidate during overload resolution) .因此,您的代码无法编译。
这在 C++17 中是可以的;有保证的复制省略调整了规则,这样移动构造函数甚至在概念上都不会被调用,所以它是否被删除或不可访问都没有关系。
在那之前,如果你这么爱auto
,你可以做到
auto&& test1 = obj();
这将创建一个临时 obj
对象并将其绑定到引用 test1
,从而将其生命周期延长至引用的生命周期。除了少数例外,该行为与您在 C++17 中使用纯 auto
.
该错误与具体使用 auto
无关。
obj test1 = obj();
也不编译。
obj()
是一个右值,编译器尝试移动它,但移动构造函数被删除。删除移动构造函数也会阻止编译器创建复制构造函数,因此它也无法复制它,因此会出现错误。