问题标签 [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 回答
137 浏览

indexing - 虚拟机。已删除的记录 - 索引 - 重新创建记录

我有一个销售订单行表(sDetail);记录上有一个索引,它实际上是一个候选索引,带有 Order 引用的键加上 STR(行号)。这用于检索特定订单的行。

sDetail 表上还有一个主索引,它是一个顺序 ID。

该命令可能会被修改。如果用户删除了订单行,我在此表中将记录标记为已删除;当我处理时,我通常使用 SET DELETED ON 运行,因此用户看不到这些已删除的记录。

但是,如果他重新创建该行,我很可能会创建一个错误“索引的唯一性被违反”,我明白这一点。为避免产生此错误,我可以看到两种可能的方法:

要么:在索引“FOR !DELETED()”上包含过滤器表达式,以便这些记录在运行时不可见

或者:当我希望测试特定行的记录是否存在时,SET DELETED OFF,测试记录的存在,并在必要时调用它。然后恢复为 SET DELETED ON。

其他开发人员是做什么的?或者,还有更好的方法?

谢谢

0 投票
1 回答
53 浏览

c++11 - 通过删除析构函数来实现非静态类?

我有一个class纯语法目的,以某种方式调用函数。这是一个简化的例子:

现在,假设我想警告用户不应实例化此类。该类可能有一些用途,但我很好奇是否可以禁止它?

首先我尝试删除默认构造函数

但这仍然是可能的:

最后,我尝试删除析构函数,这似乎有效

但似乎那时该类仍然可以由new.

我应该同时删除析构函数和删除构造函数吗(复制和移动构造函数呢?)

这是禁止实例化的最佳方法吗?代码在这里:http ://coliru.stacked-crooked.com/a/0299c377c129fffb

0 投票
0 回答
85 浏览

c++ - 在不同的 c++11 标准版本中使用删除的默认构造函数初始化类

在副本中,至少我的问题的第1点和第 4点没有答案。他们是最重要的。我可以删除其他点,但我要求不要结束整个问题。

1.在下面的代码中,obj1 是正常创建的。但是,如果我尝试取消注释 obj2 和 obj3 的创建,则编译 (-std=c++11, g++ 4.9.2) 将失败。为什么会这样?我认为无论对象的内存是在堆栈上还是在堆上分配,都应该以相同的方式执行初始化。


2.根据标准,我试图弄清楚这两种行为(obj1-case 或 obj2,obj3-cases)中的哪一种是正确的。在标准中据说(#3242 和 #3337, 8.5.4):

类型 T 的对象或引用的列表初始化定义如下:

— 如果初始值设定项列表没有元素并且 T 是具有默认构造函数的类类型,则对象是值初始化的。

好的。所以我转到值初始化定义(#3242 和#3337, 8.5.0):

如果 T 是没有用户提供的构造函数的(可能是 cv 限定的)非联合类类型,则该对象是零初始化的,并且如果 T 的隐式声明的默认构造函数是非平凡的,则调用该构造函数。

根据 (#3242, 12.1)

如果默认构造函数既不是用户提供也不是删除,并且如果: 。. .

所以删除的默认构造函数是不平凡的,因此,代码C obj1 { }; 应该无法编译。

但根据 (#3337, 12.1)

如果默认构造函数不是用户提供的并且如果: ,则默认构造函数是微不足道的。. .

因此删除默认构造函数是微不足道的代码C obj1 { }; 应该成功编译。

真相在哪里?

3.但还有更多。在下一版本的标准中,据说(# 3367,8.5.4):

类型 T 的对象或引用的列表初始化定义如下:

— 如果 T 是一个聚合,则执行聚合初始化

— 否则,如果初始值设定项列表没有元素并且 T 是具有默认构造函数的类类型,则该对象是值初始化的。

据我了解, C是一个聚合。但是在这里我有一个问题:我找不到如何创建带有已删除的默认构造函数的聚合的信息。8.5.1 Aggregates中没有此类信息。但是按照这个

当聚合由初始化列表初始化时,如 8.5.4 中所指定,初始化列表的元素被视为聚合成员的初始化,按递增的下标或成员顺序。每个成员都是从相应的 initializer-clause 复制初始化的。. . (#3367, 8.5.1)

我可以假设构造函数 [编译器在聚合的情况下生成] 在聚合初始化期间只是被忽略了。所以我可以假设删除的默认构造函数也被简单地忽略了,所以C obj { }; 应该可以成功编译,但对我来说,使用已删除的默认构造函数创建对象很奇怪。尽管如此,如果我理解正确,根据这个版本的标准 obj1-case 是可以的,而 obj2,obj3-cases 无法编译是错误的。我对吗?

4.逻辑问题是,无论如何,我应该依赖哪个标准版本#3242/#3337 或#3367?版本#3367是2012年做的,所以晚于2011年,不知道能不能叫c++11。哪个版本被认为是真正的 c++11 标准?我使用 g++ 4.9.2 编译了上面的代码示例。编译器使用什么标准变体,我怎么知道?因为版本 #3337 或 #3367 差异很大。

例如,在 #3367 中,值初始化的定义发生了巨大变化:

对 T 类型的对象进行值初始化意味着:

— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),没有默认构造函数(12.1)或用户提供或删除的默认构造函数,则对象被默认初始化;

5.在我看来,新的值初始化定义很奇怪,因为我想不出任何情况下我们可以使用已删除的默认构造函数创建和值初始化对象。我的意思是,例如,如果我将C 类的int c成员设为私有,因此 C 类不再是表达式的聚合

将是值初始化(不是以前的聚合初始化)[#3367, 8.5.4 "List-initialization"] 并且肯定无法编译。你能解释一下在新的值初始化定义中删除构造函数的那一刻吗?

我知道这里有很多文字。如果您回答了一些问题,我将非常感激。

0 投票
1 回答
73 浏览

c++11 - 如何禁止空列表初始化?

我有一个班级,根本没有任何成员。因此,它不打算被实例化。所以,我删除了默认cr。这禁止除了列表初始化之外的任何构造。有什么办法也可以禁止吗?

0 投票
2 回答
690 浏览

c++ - 删除转换运算符

有没有办法禁用转换运算符?将它们标记为“=删除”会弄乱其他事情。

考虑以下代码:

这不会编译,因为 gcc 抱怨 == 运算符不明确:

但是,在注释了转换运算符之后,代码将很好地编译和运行。

第一个问题是:为什么删除的转换运算符会给 == 运算符造成歧义?我认为他们应该禁用隐式 Foo -> int 转换,但它们似乎会影响 int -> Foo 转换,这对我来说听起来不合逻辑。

第二个:有没有办法将转换运算符标记为已删除?是的,通过不声明它们——但我正在寻找一种方式,让未来的任何人都能看到这些转换被设计禁用。

0 投票
1 回答
157 浏览

c++ - 列表初始化中多个模板化构造函数的重载规则

我不确定以下代码是否根据 c++11 标准有效,并且在不同的实现中是否应该具有相同的行为:

一般的想法是允许从字符串文字和 a std::string(此处未显示)构造,但不能从指向 的指针构造const char,这有点棘手(在这个问题中讨论)。

较新版本的 g++ (>=6.0) 和几乎所有 clang++ 版本(>=3.4) 似乎都可以很好地编译它,但是例如 g++-4.8 -std=c++11 main.cpp我收到以下错误:

所以我的问题是:
标准是否需要此代码的某种行为,如果是,谁是对的?

0 投票
1 回答
468 浏览

c++ - 使用受保护构造函数和复制构造函数创建 C++ 非堆工厂对象

由于 RAII 功能,我希望我的对象只能放置在堆栈上,并且由于对象创建应该委托给专门的工厂,我不希望 ocpy 构造函数可以访问以供使用。

所以我做了这样的事情。

我可以做这样的事情

但它看起来并不正确。

还有什么其他方法可以解决这个问题?

0 投票
4 回答
8389 浏览

c++ - 如何就地初始化数组?

如何在不复制或移动构造临时元素的情况下初始化数组?当元素具有显式deleted 复制或移动构造函数时,只有当元素具有默认 ctor 或具有所有默认参数的 ctor 并且我执行以下操作之一时,我才能初始化数组:(a)明确声明数组,(b ) 直接初始化和零初始化数组,或 (c) 复制初始化和零初始化数组。直接(但不是零)初始化和复制(但不是零)初始化都不会编译。

  1. 这 3 种方法是在不复制/移动临时元素的情况下初始化数组的唯一方法吗?
  2. a1将,a2a3count 作为初始化吗?ega1是一个声明,但它的元素获取初始值,尽管是默认值。
  3. 他们中的任何一个都是错误吗?我用 C++14 标志做了这个 GCC 6.3.0。
  4. 为什么复制初始化结合零初始化仍然在复制初始化的范畴下工作?
  5. 一般来说,所有带有花括号的数组初始化都只是临时元素的构造(除非在没有删除复制或移动构造函数时省略(或者省略不适用于数组?)),然后是每个元素的复制、移动或混合复制和移动构造?
0 投票
1 回答
2777 浏览

c++ - 为什么我使用已删除的函数 'void std::ref(const _Tp&&) [with _Tp = int]'

例如,如果我ref()这样使用,编译器会说

使用已删除的函数 'void std::ref(const _Tp&&) [with _Tp = int]'

但是,如果我的代码如下

我将成功获得输出i = 3,所以我不明白为什么我会得到如此不同的答案。

0 投票
1 回答
199 浏览

c++ - 使用 C++ 模板定义函数但显式删除它以防止误用

我有一个带有构造函数的模板类,我想在其中明确禁止使用定义明确的列表之外的任何类型,如下所示:

但是,由于整数双精度版本的代码是相同的,只是类型不同,所以我想使用模板化版本来定义它,例如:

而实际上不必为两个有效的构造函数复制代码。

但是,当我尝试这样做时,我得到:

它通过删除"= delete"起作用。

有没有办法使用模板来定义函数但没有明确允许接收比也明确描述的类型更多的类型?

我检查了如何防止函数模板中的隐式转换?还有为什么我可以阻止基元而不是用户定义类型的隐式转换?,但他们的问题似乎并不等同于当前的问题。

非常感谢。

更新:使用 gcc-4.8.5,它可以工作!!!即使包含= delete关键字。