在 C++11 中“删除”复制 ctor/assignment
Posted
技术标签:
【中文标题】在 C++11 中“删除”复制 ctor/assignment【英文标题】:"deleting" copy ctor/assignment in C++11 【发布时间】:2011-10-29 03:47:06 【问题描述】:在 VS 2010 SP1 中,如下:
class Foo
public:
Foo()
Foo(Foo const&) = delete; // Line 365
Foo& operator=(Foo const&) = delete; // Line 366
;
不编译。它抱怨:
CPPConsole.cpp(365):错误 C2059:语法错误:';' CPPConsole.cpp(365): 错误 C2238: ';'之前的意外令牌 CPPConsole.cpp(366):错误 C2059:语法错误:';' CPPConsole.cpp(366): 错误 C2238: ';' 前面的意外标记
这还不支持吗?奇怪的是,Intellisense 似乎可以识别这个结构。它说“IntelliSense: function "Foo::operator=(const Foo &)"(在第 366 行声明)不能被引用——它是一个已删除的函数”
我错过了什么?
【问题讨论】:
【参考方案1】:VS 2010 具有双重性格。具体来说,它实际上有两个完全独立的编译器前端。
当您编译代码时,这是使用 Microsoft 自己的编译器完成的,该编译器可以追溯到大约 3 年前发布的用于 MS-DOS 的 MS C 3.0(如果您想知道为什么它是 3.0,MS 已售出)之前的 Lattice C 的重新标记版本)。
在 VS 2008 之前,与编译器相比,IDE 中的解析相当原始,因此它不能非常正确地解析很多更复杂的 C++。他们认为这是不可接受的,因此他们没有尝试升级 IDE 的现有解析器以匹配编译器,而是授权 EDG 编译器前端。
这或多或少产生了相反的情况:IDE 的 Intellisense 解析器现在比编译器上的解析器更接近于符合标准,并且可以识别相当数量的 C++0x 构造,而编译器没有。
故事不止于此:EDG 编译器前端支持一个开关,使其更像 VC++,包括模拟相当多的 VC++ 错误。尽管我没有数据可以证实这一点,但我的假设是 Microsoft 使用了该功能。由于这是基于 EDG 采用 VC++ 编译器并模拟其错误,因此可以合理猜测(至少通常)EDG 的 VC++ 模拟将运行在 VC++ 本身之后的版本。这给出了有点自相矛盾的情况,EDG(在正常使用中)通常比 VC++ 领先很多,但 MS 在 IDE 中使用的版本在大多数情况下可能至少稍微落后。
【讨论】:
谢谢! +1 也可以从历史角度回答问题。 我不确定智能感知解析器比提供的编译器更接近标准。当智能感知显示“没有运算符匹配操作数”而编译器的 ADL 发现它没有问题时,我经常观察到相反的情况。看起来一致性不是智能感知使用不同解析器的原因,而是解析速度。 @Gene - 编译器以不正确执行 ADL 和模板而闻名。 EDG 前端更加可靠。 @Bo Persson -- 我知道,这就是人们常说的,但在这种情况下,VC 肯定是对的,而 intellisense 肯定是错的。【参考方案2】:它还没有在 VS2010 中实现。
【讨论】:
那么intellisense怎么知道它被删除了,因此不能被引用呢? 如果我不感到困惑,我为什么要在我的问题中指出一个“奇怪”的东西?以上是关于在 C++11 中“删除”复制 ctor/assignment的主要内容,如果未能解决你的问题,请参考以下文章