可能的重复:
为什么 C++11 删除的函数参与重载决策?
我对以下 C++11 代码有两个问题:
#include <iostream>
using namespace std;
struct A {
A() { cout << "Default c-tor" << endl; }
A(const A&) { cout << "Copy c-tor" << endl; }
A(A&&) = delete;
};
A f()
{
A a;
return a;
}
int main()
{
A b = f();
return 0;
}
使用 gcc 和 clang 时出现以下编译错误
gcc-4.7.2 (g++ --std=c++11 main.cpp):
main.cpp: In function ‘A f()’:
main.cpp:16:9: error: use of deleted function ‘A::A(A&&)’
main.cpp:8:2: error: declared here
main.cpp: In function ‘int main()’:
main.cpp:21:10: error: use of deleted function ‘A::A(A&&)’
main.cpp:8:2: error: declared here
clang-3.0 (clang++ --std=c++11 main.cpp):
main.cpp:19:4: error: call to deleted constructor of 'A'
A b = f();
^ ~~~
main.cpp:8:2: note: function has been explicitly marked deleted here
A(A&&) = delete;
^
1 error generated.
- 如果显式删除移动构造函数,编译器不应该使用复制构造函数吗?
- 有谁知道“不可移动”类型的用途吗?
提前致谢。
A(A&&) = delete;
将其声明并定义为delete
仍然声明它,并且不会使其完全不存在。相反,它是similar(但不相同)声明它为空且私有。就像这样:
private:
A(A&&){}
事实上,这也是其他操作员之前有时使用的技巧= delete
可用。
同样,它以查找的方式存在,但永远不允许调用它,并且在 C++ 中,调用权限(在几乎或所有情况下)是在其他所有事情(例如重载解析、名称查找)之后完成的。
标准实际上说(8.4.3)
删除的函数是隐式内联的。
并且(我发现)注意到已删除的函数不应参与名称查找。
另外,从 8.4.3
隐式或显式引用已删除函数的程序,
除了声明之外,格式不正确。 [注意:这包括调用
隐式或显式函数并形成指针或
指向函数成员的指针。它甚至适用于以下参考文献:
不可评估的表达式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)