问题标签 [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.
c++ - 任何函数都可以是删除函数吗?
工作草案明确指出默认函数必须是特殊的成员函数(例如复制构造函数、默认构造函数等(第 8.4.2.1-1 节))。这很有意义。
但是,我没有看到对已删除功能的任何此类限制(第 8.4.3 节)。那正确吗?
或者换句话说,这三个例子是否有效c++0
?
c++ - 什么是“=删除”?
这两行奇怪的代码是什么意思?
c++ - 在 C++0x 中删除虚函数
不清楚如果我在 C++0x 中删除一个虚方法会发生什么:
这是否意味着这个类以及从它继承的所有东西都不能定义/实现该derive_func()
方法?或者这是非法/编译错误?
c++ - 如何在 C++ 2011 中禁止调用右值对象的 const 成员函数?
以下代码
可能会导致崩溃,因为原始向量已经在那里被破坏。在引入右值引用后的 C++ 2011 (c++0x) 中,如果向量参数是右值,则可以使用已删除的函数声明来完全禁止调用at
看起来不错,但是下面的代码仍然会导致崩溃
因为operator [] (size_type) const
仍然允许调用右值对象的成员函数。有什么办法可以禁止这种电话吗?
使固定:
上面的例子不是我在实际项目中所做的。我只是想知道 C++ 2011 是否支持任何符合条件的成员函数
使固定:
这很棒,但我认为 C++ 标准在这个特性上走得太远了。无论如何,我在 clang++ 2.9 上编译了以下代码
非常感谢!
c++ - 错误:使用已删除的功能
我一直在编写一个朋友编写的一些 C++ 代码,并且在使用 gcc4.6 编译时遇到以下我从未见过的错误:
编辑:这来自使用 boost MSM 的部分代码:Boost Webpage
Edit2:源代码中的任何地方都没有= delete()
使用。
一般来说,这个错误是什么意思?发生此类错误时我应该寻找什么?
c++ - 通过函数打开流
我需要有关 s 的不可复制性质的帮助[io](f)stream
。
我需要在fstream
s 周围提供一个 hackish 包装器,以便在 Windows 上处理文件名中包含 unicode 字符的文件。为此,我设计了一个包装函数:
当然,这std::swap
条线是罪魁祸首。我也尝试从函数返回流,但它会导致同样的问题。a 的复制构造函数std::istream
是delete
d。我也尝试过std::move
,但没有帮助。我该如何解决这个问题?
编辑:Keep It Simple (TM)
感谢@tibur 的想法,我终于找到了一个很好的方法,但又很实用。从某种意义上说,它仍然是骇人听闻的,因为它取决于所使用的 Windows 标准 C++ 库,但由于只有两个真正的库在使用,所以对我来说这不是问题。
在用户代码中:
这取决于 C++0x<memory>
和auto
关键字。当然,您不能只close
使用结果stream
变量,但 GNU Libstdc++std::istream
析构函数确实负责关闭文件,因此在任何地方都不需要额外的内存管理。
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
是:
c++ - 对于默认构造函数和析构函数,“=default”与“{}”有何不同?
我最初将其发布为仅关于析构函数的问题,但现在我正在添加对默认构造函数的考虑。这是原始问题:
如果我想给我的类一个虚拟的析构函数,但与编译器生成的析构函数相同,我可以使用
=default
:但似乎我可以通过使用空定义减少输入来获得相同的效果:
这两个定义有什么不同的表现吗?
根据针对此问题发布的回复,默认构造函数的情况似乎相似。鉴于析构函数的“ =default
”和“ {}
”之间的含义几乎没有区别,那么默认构造函数的这些选项之间的含义是否也几乎没有区别?也就是说,假设我想创建一个类型,该类型的对象将被创建和销毁,我为什么要说
代替
?
如果在原始发布后扩展此问题违反了某些 SO 规则,我深表歉意。为默认构造函数发布一个几乎相同的问题让我觉得不太理想。
c++ - 是否有可复制但不可移动的类的用例?
在阅读了@Mehrdad最近提出的关于哪些类应设为不可移动因此不可复制的问题后,我开始想知道是否存在可以复制但不可移动的类的用例。从技术上讲,这是可能的:
虽然S
有一个复制构造函数,但它显然没有对CopyConstructible
概念进行建模,因为这反过来又是对MoveConstructible
概念的一种改进,它需要存在一个(未删除的)移动构造函数(参见第 17.6.3.1/2 节,表 21) .
S
像上面这样的类型是否有任何用例,它是可复制但不可复制 CopyConstructible
且不可移动的?如果不是,为什么不禁止在同一个类中声明复制构造函数和删除的移动构造函数?
c++ - 现在允许使用虚拟基础移动赋值运算符时会出现危险吗?
这涉及 C++ 问题http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1402的解决。概括:
(问题是我们收到了这个片段的错误,即使编译器可以简单地使用“S”的复制构造函数,就像用户显式编写“wrap”的移动构造函数时那样。问题已解决为在重载决议期间忽略已删除的移动构造函数(和赋值运算符),因此根据需要使用上面的复制构造函数。)
在起草该决议时,对该决议发表了以下评论:
与复制相关的隐式/默认移动操作没有其他限制。这意味着虚拟基础中的移动分配是危险的(编译器可能应该警告)[...] 但是我们在 Batavia 中决定我们不会保留所有 C++03 代码以防止隐式移动操作,我认为该解决方案提供了显着的性能优势。
有人可以描述一下虚拟基地移动分配运算符的问题吗?