问题标签 [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 投票
1 回答
4164 浏览

c++ - 使用默认复制构造函数时出错:“已删除函数”

我正在使用 g++ 5.1.0 编译以下 C++14 程序test.cpp

当我尝试编译时,出现以下错误:

我不知道从哪里开始诊断这个问题,因为对我来说,复制构造函数存在并且没有被删除似乎相当明显。这可能是什么原因?

0 投票
1 回答
2941 浏览

c++ - 已删除“一般”案例的专用模板函数无法使用 g++ <=4.8.0 和 clang++ 编译

用旧版本的g++(4.8.0,MinGW)编译项目我发现这段代码编译失败:

如果发现基本情况已被删除,g++ 似乎甚至不会尝试寻找显式的特化。

相反,g++ 4.8.4 和 5.2(在 Linux 上)不会抱怨。这是旧版本编译器中的错误还是标准中的灰色区域?


附录

clang 3.4.1 似乎也不喜欢它:

(评论中的@Baum mit Augen报告说它在 3.7 中仍然不起作用)

0 投票
2 回答
15413 浏览

c++ - 删除复制构造函数和复制赋值运算符。其中哪些是必不可少的?

我有一个用例,不能以任何方式复制我的对象。我在下面写了一个夸大的复制构造函数和复制赋值运算符删除的完整列表。它们太多了,我无法确定要使用哪些,有时这让我很偏执。我不必将它们全部写在我的代码中,是吗?那么,为了防止任何类型的对象复制,我应该使用哪一个?

0 投票
2 回答
3383 浏览

c++ - 禁止使用 `static_assert` 的函数

我想阻止调用某些函数。让我们忽略通过函数指针或其他东西调用函数的情况,只关注直接函数调用的情况。我可以用= delete. 但是,发出的诊断信息并不十分丰富。我考虑使用static_assert,您可以使用它提供自定义诊断消息。我static_assert(false, ...)在函数体内放置了一条语句,希望它在函数被调用时触发。但是,事实证明static_assert即使没有调用该函数也会失败。有什么建议么?

附加说明:该功能是无条件禁止的。所以,std::enable_if这里不适用。这样一个函数的动机是我想阻止某些使用,否则它可以通过重载解析很好地编译。所以我不能只删除该功能。deprecated不是我想要的。我想要一个编译错误,而不是一个警告。

0 投票
1 回答
191 浏览

c++ - 引用限定符和删除的成员方法

考虑以下代码:

它不会编译说成员方法不能重载,当然这是有道理的。

另一方面,以下代码编译:

那是合法的代码吗?
难道不能在同一个类中定义两个完全不同的接口,前者用于左值,后者用于右值?
除了它没有多大意义之外,它真的伤害了我。
不应该将已删除的函数作为一个整体删除,而不是仅当您是左值时才删除
此功能的目的是什么?它是经典的不起眼的角落案例还是我看不到的东西?

0 投票
2 回答
846 浏览

c++ - 为什么不能构造包含 ostringstream 成员的对象?

我有以下类示例,从一个更大的项目中简化而来。它基于一个日志框架,该框架使用记录器的范围来终止析构函数中的日志条目。

下面的代码不会编译,因为构造函数是一个隐式删除的函数(edit: not true),这似乎与std::ostringstream对象有关。我对此感到困惑,因为我认为我应该能够直接构造 a std::ostringstream,这意味着我应该能够直接构造一个Container对象。

请注意,标有“工作正常”的行就是这样做的。好像是实例化了一个匿名Container对象,里面包含一个 new std::ostringstream,可以直接访问输出“world”。自身创建消息的Container“Hello”部分,其析构函数刷新缓冲区。

为什么Container命名和保存对象的第二部分不能正确运行?这是我得到的错误示例:

... 等等。

0 投票
1 回答
420 浏览

c++ - 合并 unique_ptr 的两个向量时“使用已删除函数”

我正在尝试合并两个向量unique_ptr(即std::move它们从一个向量到另一个向量)并且我一直遇到“使用已删除函数......”的错误文本墙。根据错误,我显然正在尝试使用unique_ptr已删除的复制构造函数,但我不知道为什么。下面是代码:

0 投票
3 回答
17337 浏览

c++ - 默认移动构造函数/赋值和删除的复制构造函数/赋值

根据标准,

如果类 X 的定义没有显式声明移动构造函数,当且仅当

— X 没有用户声明的复制构造函数,

— X 没有用户声明的复制赋值运算符,

— X 没有用户声明的移动赋值运算符,并且

— X 没有用户声明的析构函数。

现在以下无法编译

所以似乎删除的函数被认为是用户定义的,这是有道理的(它不是它的默认实现)。但是,在那种特殊情况下,如何删除复制构造函数/赋值混乱默认移动构造函数/赋值?

我认为这个问题具有实际意义,因为手动生成和 esp。维护这些默认函数很容易出错,同时,类成员(std::unique_ptr如类成员)使用的(正义的)增加使得不可复制的类比过去更常见。

0 投票
2 回答
1002 浏览

c++ - C++:尝试将 fstream 作为参数传递时删除了函数?

我不知道我的代码有什么问题。我正在尝试从控制台获取两个文件的文件路径,然后我用这些文件初始化一些 fstream 对象,ios::in | ios::out其中一个,另外一个ios::binary

以下是我的代码的重要部分:

然而,Visual Studio 在INPUT_DATA(dataFile);INPUT_TARGETS(targetsFile);部分对我大喊大叫,说:

我翻遍了头文件,直到找到第 1244 行:

我不知道为什么会这样。我对 C++ 还是很陌生,我可能刚刚做了一些愚蠢的事情,但是有人可以帮忙吗?

编辑:澄清标题

0 投票
1 回答
699 浏览

c++ - 将已删除的函数声明为 noexcept 有什么意义吗?

考虑一个类的这两个可能的定义:

展品 A:

图表 A':

将已删除的函数声明为 有什么意义noexcept