删除的构造函数 - MSVC报告错误,Clang没有

H B*_*amy 9 c++ gcc clang visual-c++ language-lawyer

请考虑以下代码:

class SILPassPipelinePlan final {
public:
  SILPassPipelinePlan() = default;
  ~SILPassPipelinePlan() = default;
  SILPassPipelinePlan(const SILPassPipelinePlan &) = default;
  SILPassPipelinePlan(SILPassPipelinePlan &&) = delete;

  SILPassPipelinePlan x() {
    SILPassPipelinePlan P;

    return P;
  }
};

int main() {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

MSVC报告以下错误:

1> consoleapplication2.cpp(13):错误C2280:'SILPassPipelinePlan :: SILPassPipelinePlan(SILPassPipelinePlan &&)':尝试引用已删除的函数

1> consoleapplication2.cpp(8):注意:请参阅'SILPassPipelinePlan :: SILPassPipelinePlan'的声明

Clang和GCC没有.

从规范的角度来看,哪个编译器是正确的?这是一个MSVC错误,还是一个Clang错误?

MSVC来自最新的Visual Studio 2015 Update 3,Clang是3.9.0版.

Col*_*mbo 7

C++ 11在某些场景中引入了隐式移动 - 包括:

在以下复制初始化上下文中,可能会使用移动操作而不是复制操作:

  • 如果return语句([stmt.return])中的表达式是一个(可能带括号的)id-expression,它指定一个对象,该对象具有在最内层封闭函数或lambda-expression的body或parameter-declaration-clause声明的自动存储持续时间 , 要么

  • [...]

首先执行重载决策以选择副本的构造函数,就好像该对象是由rvalue指定的一样.如果第一个重载决议失败,[...]

Clang(唯一接受的实现,顺便说一句)要么误解"失败"以包括已删除函数的选择,要么过于宽松地应用[over.match.funcs]/8.见错误31025.