问题标签 [deleted-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
677 浏览

c++ - 任何函数都可以是删除函数吗?

工作草案明确指出默认函数必须是特殊的成员函数(例如复制构造函数、默认构造函数等(第 8.4.2.1-1 节))。这很有意义。

但是,我没有看到对已删除功能的任何此类限制(第 8.4.3 节)。那正确吗?

或者换句话说,这三个例子是否有效c++0

0 投票
2 回答
529 浏览

c++ - 什么是“=删除”?

这两行奇怪的代码是什么意思?

0 投票
2 回答
4507 浏览

c++ - 在 C++0x 中删除虚函数

不清楚如果我在 C++0x 中删除一个虚方法会发生什么:

这是否意味着这个类以及从它继承的所有东西都不能定义/实现该derive_func()方法?或者这是非法/编译错误?

0 投票
2 回答
574 浏览

c++ - 如何在 C++ 2011 中禁止调用右值对象的 const 成员函数?

以下代码

可能会导致崩溃,因为原始向量已经在那里被破坏。在引入右值引用后的 C++ 2011 (c++0x) 中,如果向量参数是右值,则可以使用已删除的函数声明来完全禁止调用at

看起来不错,但是下面的代码仍然会导致崩溃

因为operator [] (size_type) const仍然允许调用右值对象的成员函数。有什么办法可以禁止这种电话吗?

使固定:

上面的例子不是我在实际项目中所做的。我只是想知道 C++ 2011 是否支持任何符合条件的成员函数

使固定:

这很棒,但我认为 C++ 标准在这个特性上走得太远了。无论如何,我在 clang++ 2.9 上编译了以下代码

非常感谢!

0 投票
6 回答
277807 浏览

c++ - 错误:使用已删除的功能

我一直在编写一个朋友编写的一些 C++ 代码,并且在使用 gcc4.6 编译时遇到以下我从未见过的错误:

编辑:这来自使用 boost MSM 的部分代码:Boost Webpage

Edit2:源代码中的任何地方都没有= delete()使用。

一般来说,这个错误是什么意思?发生此类错误时我应该寻找什么?

0 投票
4 回答
1838 浏览

c++ - 通过函数打开流

我需要有关 s 的不可复制性质的帮助[io](f)stream

我需要在fstreams 周围提供一个 hackish 包装器,以便在 Windows 上处理文件名中包含 unicode 字符的文件。为此,我设计了一个包装函数:

当然,这std::swap条线是罪魁祸首。我也尝试从函数返回流,但它会导致同样的问题。a 的复制构造函数std::istreamdeleted。我也尝试过std::move,但没有帮助。我该如何解决这个问题?

编辑:Keep It Simple (TM)感谢@tibur 的想法,我终于找到了一个很好的方法,但又很实用。从某种意义上说,它仍然是骇人听闻的,因为它取决于所使用的 Windows 标准 C++ 库,但由于只有两个真正的库在使用,所以对我来说这不是问题。

在用户代码中:

这取决于 C++0x<memory>auto关键字。当然,您不能只close使用结果stream变量,但 GNU Libstdc++std::istream析构函数确实负责关闭文件,因此在任何地方都不需要额外的内存管理。

0 投票
1 回答
589 浏览

c++ - 这个不可复制的地图是合法的c ++ 11吗?GCC 4.7 和 MSVS 2010 允许它。Clang 3.1 没有

我创建了一个无法用 clang 编译的不可复制的地图。由于 clang 意味着非常符合标准,我想知道我的代码是否合法。MSVS 2010 和 GCC 4.7 编译此代码时不会出现警告或错误。

附上完整代码:有问题的行是main.

= delete需要为 MSVS 2010 移除

使用时的错误信息clang++-mp-3.1 -std=c++0x -stdlib=libc++ MapOfMaps.cpp是:

0 投票
3 回答
66693 浏览

c++ - 对于默认构造函数和析构函数,“=default”与“{}”有何不同?

我最初将其发布为仅关于析构函数的问题,但现在我正在添加对默认构造函数的考虑。这是原始问题:

如果我想给我的类一个虚拟的析构函数,但与编译器生成的析构函数相同,我可以使用=default

但似乎我可以通过使用空定义减少输入来获得相同的效果:

这两个定义有什么不同的表现吗?

根据针对此问题发布的回复,默认构造函数的情况似乎相似。鉴于析构函数的“ =default”和“ {}”之间的含义几乎没有区别,那么默认构造函数的这些选项之间的含义是否也几乎没有区别?也就是说,假设我想创建一个类型,该类型的对象将被创建和销毁,我为什么要说

代替

?

如果在原始发布后扩展此问题违反了某些 SO 规则,我深表歉意。为默认构造函数发布一个几乎相同的问题让我觉得不太理想。

0 投票
5 回答
1862 浏览

c++ - 是否有可复制但不可移动的类的用例?

在阅读了@Mehrdad最近提出的关于哪些类应设为不可移动因此不可复制的问题后,我开始想知道是否存在可以复制但不可移动的类的用例。从技术上讲,这是可能的:

虽然S有一个复制构造函数,但它显然没有对CopyConstructible概念进行建模,因为这反过来又是对MoveConstructible概念的一种改进,它需要存在一个(未删除的)移动构造函数(参见第 17.6.3.1/2 节,表 21) .

S像上面这样的类型是否有任何用例,它是可复制但不可复制 CopyConstructible 且不可移动的?如果不是,为什么不禁止在同一个类中声明复制构造函数删除的移动构造函数?

0 投票
1 回答
1239 浏览

c++ - 现在允许使用虚拟基础移动赋值运算符时会出现危险吗?

这涉及 C++ 问题http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1402的解决。概括:

(问题是我们收到了这个片段的错误,即使编译器可以简单地使用“S”的复制构造函数,就像用户显式编写“wrap”的移动构造函数时那样。问题已解决为在重载决议期间忽略已删除的移动构造函数(和赋值运算符),因此根据需要使用上面的复制构造函数。)

在起草该决议时,对该决议发表了以下评论:

与复制相关的隐式/默认移动操作没有其他限制。这意味着虚拟基础中的移动分配是危险的(编译器可能应该警告)[...] 但是我们在 Batavia 中决定我们不会保留所有 C++03 代码以防止隐式移动操作,我认为该解决方案提供了显着的性能优势。

有人可以描述一下虚拟基地移动分配运算符的问题吗?