luc*_*rod 11 c++ gcc clang move-semantics c++11
可能重复:
为什么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;
}
Run Code Online (Sandbox Code Playgroud)
我用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
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
提前致谢.
A(A&&) = delete;
Run Code Online (Sandbox Code Playgroud)
声明并定义它delete仍然会声明它,并且不会使它完全不存在.相反,将它声明为空和私有类似(但不完全相同).像这样:
private:
A(A&&){}
Run Code Online (Sandbox Code Playgroud)
事实上,这是有时用于其他运营商的技巧= delete.同样,它存在于查找的意义上,但调用它是不允许的,并且在C++调用权限(几乎或所有情况下)都在其他所有事情之后完成,例如重载解析,名称查找.
标准实际上说(8.4.3)
删除的函数隐式内联.
并且注意到(我发现)说删除的函数不应该参与名称查找.
另外,从8.4.3开始
除了声明它之外,隐式或显式引用已删除函数的程序是不正确的.[注意:这包括隐式或显式调用函数并形成指向函数的指针或指向成员的指针.它甚至适用于未进行潜在评估的表达式中的引用.
| 归档时间: |
|
| 查看次数: |
1740 次 |
| 最近记录: |