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版.
C++ 11在某些场景中引入了隐式移动 - 包括:
在以下复制初始化上下文中,可能会使用移动操作而不是复制操作:
如果return语句([stmt.return])中的表达式是一个(可能带括号的)id-expression,它指定一个对象,该对象具有在最内层封闭函数或lambda-expression的body或parameter-declaration-clause中声明的自动存储持续时间 , 要么
[...]
首先执行重载决策以选择副本的构造函数,就好像该对象是由rvalue指定的一样.如果第一个重载决议失败,[...]
Clang(唯一接受的实现,顺便说一句)要么误解"失败"以包括已删除函数的选择,要么过于宽松地应用[over.match.funcs]/8.见错误31025.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |