我正在尝试对函数中的所有局部变量使用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完全相同的声明类型是编译器错误。显然应该是编译器错误,但是在这种情况下,这是否意味着无法使用auto定义obj?我遇到了我无法控制的QT对象的问题。
我是否仍在使用C ++ 98格式声明变量,还是有另一种使用auto的方法?
谢谢!!!
这在C ++ 17中是可以的。有保证的复制省略会调整规则,以便在概念上甚至都不会调用move构造函数,因此删除还是无法访问都无关紧要。
在那之前,如果你爱得auto
那么多,你可以做
auto&& test1 = obj();
这将创建一个临时obj
对象并将其绑定到引用test1
,从而将其生存期延长到引用的生存期。除了少数例外,其行为与在C ++ 17中使用plain所获得的行为几乎相同auto
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句