C++ 11"不可移动"类型

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)
  • 如果显式删除了移动构造函数,编译器是否应该使用复制构造函数?
  • 有没有人知道"不可移动"类型的用途?

提前致谢.

Joh*_*erg 6

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开始

除了声明它之外,隐式或显式引用已删除函数的程序是不正确的.[注意:这包括隐式或显式调用函数并形成指向函数的指针或指向成员的指针.它甚至适用于未进行潜在评估的表达式中的引用.

  • @Nawaz:它和其他​​两个答案一样,因为如果它真的"不存在"那么就不会在重载决策中考虑它.Ofc我不会超过标准来引入与"英语"含义相矛盾的"存在"的技术定义;-)它被考虑用于某些目的而不是其他目的,尽管它没有函数体,因此它与定义的私有函数不同以上. (2认同)