【发布时间】:2016-09-16 17:09:54
【问题描述】:
我正在尝试将 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();,您正在使用“复制初始化”。但是,obj既不是可复制构造的(它声明了一个移动构造函数,阻止了复制构造函数的隐式生成),也不是可移动构造的(它被声明为已删除)。 -
为防止将来出现此类陷阱,请考虑使用 C++ 的“5 规则”
-
谢谢,我明白发生了什么以及为什么它不起作用。我的问题是, auto 可以与这样的课程一起使用吗?如果是的话怎么做。
-
这两行根本没有做完全相同的事情。实际上我不知道在什么情况下声明
obj test0;可能无法编译,而我可以想象很多auto test1 = obj();无法编译的原因 -
@LukeDupin 哦,当然,多么愚蠢的评论......
标签: c++ c++11 move-semantics c++17