- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
摘自标准 20.12 [function.objects]:
template <class T> reference_wrapper<T> ref(T&) noexcept;
template <class T> reference_wrapper<const T> cref(const T&) noexcept;
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
我习惯于在成员函数的上下文中看到 =delete
。目的是禁止编译器提供的操作。例如,使类不可复制或不可移动。
然而,在这种情况下,意图似乎是意图的文档。这是正确的吗?在其他情况下,在非成员函数上使用 =delete
是可取、可取或不可避免的吗?
最佳答案
我知道明确delete
的原因有两个。免费功能:拒绝不需要的隐式转换,为用户提供更好的错误体验。
const
的一个有用功能|临时人员可以绑定(bind)到对 const
的引用吗? .所以这行得通:
void foo(const int& );
foo(42); // ok
那个临时的42
绑定(bind)到函数的引用参数,并且它的生命周期与该引用参数绑定(bind)。
现在,考虑 std::cref()
.目标是通过这个reference_wrapper
到某个地方,所以我们需要底层引用来保持活力。如果我们只是有这个重载:
template <class T>
reference_wrapper<const T> cref(const T&) noexcept;
然后我可以写std::cref(42)
.那会很好用,我会返回 std::reference_wrapper<const int>
- 除非它是一个悬空的引用。该代码不可能工作。
为了修复这个明显的错误,我们也有这个重载:
template <class T> void cref(const T&&) = delete;
也就是说,我们正在显式删除(或定义为已删除)采用任何右值的重载。现在,在进行重载解析时,当我传入一个右值时,第二次重载是首选,并且该重载格式不正确,编译器会通知我们我们的错误(愚蠢的我,我不能这样做 cref(42)
!)我不得不花几个小时在 gdb 上试图弄清楚为什么我没有对象。
标准库中的其他示例有:
std::as_const()
std::addressof()
std::regex_match()
和 std::regex_search()
(#6 接受左值字符串,#7 拒绝右值字符串)。另一类示例可能是为受约束的函数提供更好的诊断。假设我有一个只对整数类型有意义的函数:
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void foo(T);
我尝试用非整数类型调用它:
foo(4.2); // error: no matching function
根据需要,这会失败。但是你得到的错误并不是很有意义。特别是如果有其他重载。有了概念画板,这会更好——希望,但不一定。
但是如果我添加相反的显式删除重载:
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void foo(T);
template <typename T, std::enable_if_t<!std::is_integral_v<T>, int> = 0>
void foo(T) = delete;
foo(4.2); // error: use of deleted function
这更加明确和直接。特别是如果 foo
的作者提供注释说明为什么这很重要。基本上,这仍然是 SFINAE 友好的,同时还提供了 static_assert
的好处直接指示失败(而如果我们只是 static_assert
编辑,我们会得到更清晰的信息,但我们会失去对 SFINAE 的友好性)。
确实,N4186 的动机是使该注释成为代码本身的一部分(尽管该提议被拒绝了)。那篇论文中的例子是:
template <typename T>
enable_if_t<has_compatible_vector_size<simd_float, T>::value, simd_float>
operator+(simd_float, T);
template <typename T>
enable_if_t<!has_compatible_vector_size<simd_float, T>::value, simd_float>
operator+(simd_float, T) = delete;
标准库中的一个例子是 std::make_unique()
对于 make_unique<U[N]>
.
关于c++ - 在非成员函数上使用 delete 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42332777/
我写了这个课: class StaticList { private: int headFree; int headList; int locNe
我目前正在使用 SQL Server Management Studio 2005,我遇到了一些问题,但首先是我的 DB 架构的摘录(重要的): imghack link to the image 我
范围:两个表。创建新顾客时,他们会将一些有关他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------+--
我想知道,在整个程序中,我使用了很多指向 cstrings 的 char* 指针,以及其他指针。我想确保在程序完成后删除所有指针,即使 Visual Studio 和 Code Blocks 都为我做
考虑以下代码: class Foo { Monster* monsters[6]; Foo() { for (int i = 0; i < 6; i++)
关于 this page , 是这么写的 One reason is that the operand of delete need not be an lvalue. Consider: delet
我无法在 DELETE CASCADE ON UPDATE CASCADE 上添加外键约束。 我使用两个简单的表格。 TAB1 有 2 列:ID int(10) unsigned NOT NULL A
你好,有没有办法把它放在一个声明中? DELETE e_worklist where wbs_element = '00000000000000000054TTO'. DELETE e_workli
我有一个表,它是我系统的核心,向我的客户显示的所有结果都存储在那里。它增长得非常快,因此每 3 小时我应该删除早于 X 的记录以提高性能。 仅删除这些记录就足够了,还是应该在删除后运行优化表? 我正在
这个问题在这里已经有了答案: delete vs delete[] operators in C++ (7 个答案) 关闭 9 年前。 做和做有什么区别: int* I = new int[100]
为什么这段代码是错误的?我是否遗漏了有关 delete 和 delete[] 行为的内容? void remove_stopwords(char** strings, int* length) {
当我使用 new [] 申请内存时。最后,我使用 delete 来释放内存(不是 delete[])。会不会造成内存泄漏? 两种类型: 内置类型,如 int、char、double ... 我不确定。
所以在代码审查期间,我的一位同事使用了 double* d = new double[foo]; 然后调用了 delete d。我告诉他们应该将其更改为 delete [] d。他们说编译器不需要基本
范围:两个表。当一个新顾客被创建时,他们将一些关于他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------
C++14 介绍 "sized" versions of operator delete ,即 void operator delete( void* ptr, std::size_t sz ); 和
我正在执行类似的语句 DELETE FROM USER WHERE USER_ID=1; 在 SQLDeveloper 中。 由于用户在许多表中被引用(例如用户有订单、设置等),我们激活了 ON DE
出于某种原因,我找不到我需要的确切答案。我在这里搜索了最后 20 分钟。 我知道这很简单。很简单。但由于某种原因我无法触发触发器.. 我有一个包含两列的表格 dbo.HashTags |__Id_|_
这是我的代码: #include #include #include int main() { setvbuf(stdout, NULL, _IONBF, 0); setvbuf
是否可以在 postgres 中使用单个命令删除所有表中的所有行(不破坏数据库),或者在 postgres 中级联删除? 如果没有,那么我该如何重置我的测试数据库? 最佳答案 is it possib
我想删除一些临时文件的内容,所以我正在开发一个小程序来帮我删除它们。我有这两个代码示例,但我对以下内容感到困惑: 哪个代码示例更好? 第一个示例 code1 删除文件 1 和 2,但第二个示例 cod
我是一名优秀的程序员,十分优秀!