deleted-functions相关内容

删除“通用"的专用模板函数案例无法使用 g++ <=4.8.0 和 clang++ 编译

用旧版本的g++(4.8.0,MinGW)编译项目我发现这段代码编译失败: templatevoid foo() = 删除;模板void foo(){}int main() {foo();返回0;} 如果 g++ 看到基本情况被删除,它似乎甚至不会尝试寻找显式特化. mitalia@mitalia:~/scratch$/opt/mingw32-dw2/bin/i686-w64-mingw ..

解决由于不变成员导致的编译器错误,并带有可能删除的默认构造函数

我按此顺序提出了一系列与同一源代码相关的一系列问题: experimenting-with-unions-and-bitfields在结构和模板内 “> try-to-flip-the-order-of -bits-in-stdbitset 避免-ambiguity-in-overload-resolution 我还在“代码审查"中问了一系列与此相关的问题. emulatio ..
发布时间:2020-07-21 19:01:59 C/C++开发

禁止使用`static_assert`函数

我想防止某些函数被调用.让我们忽略通过函数指针或其他函数调用函数的情况,仅关注直接函数调用的情况.我可以用= delete做到这一点.但是,发出的诊断信息并不充分.我考虑过使用static_assert,您可以使用它提供自定义诊断消息.我在函数体内放置了static_assert(false, ...)语句,希望它在调用函数时触发.但是,事实证明即使未调用该函数,static_assert也将失败 ..
发布时间:2020-07-21 19:01:57 C/C++开发

在基类中删除复制和移动构造函数/赋值运算符是否足够?

如果我有一个抽象基类,并且想使所有派生类不可复制且不可移动,那么声明在基类中删除的这些特殊成员函数就足够了吗?我想确保我的整个类层次结构是不可复制和不可移动的,并且想知道是否可以不必在每个派生类中将这4个特殊成员函数声明为已删除.我看到一个SO答案,似乎暗示着派生类尽管已从基类中删除了,但仍可以显式声明副本或移动构造函数,但以下示例在尝试定义默认的副本赋值运算符时导致编译错误,因此我不确定.这是错 ..
发布时间:2020-07-21 19:00:53 C/C++开发

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

我有以下课程示例,是从较大的项目简化而来的.它基于一个日志记录框架,该框架使用记录器的作用域终止析构函数中的日志条目. 下面的代码将无法编译,因为构造函数是一个隐式删除的函数( edit:不是true ),该函数似乎与std::ostringstream对象有关.我对此感到困惑,因为我认为我应该能够直接构造std::ostringstream,这意味着我应该能够直接构造Container对象 ..
发布时间:2020-07-21 18:59:50 C/C++开发

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

考虑一个类的以下两种可能的定义: 展览A: struct A { A() = delete; }; 图A': struct A { A() noexcept = delete; } 将已删除的函数声明为noexcept有什么意义吗? 解决方案 (最初将其发布为评论,但建议将其发布为答案.) 不,不.不能调用已删除的函数(或者在构造函数的情况下 ..

删除复制代码&复制分配-是公共的,私人的还是受保护的?

为了使对象不可复制,我们可以显式删除其复制构造函数和复制赋值运算符。 我的问题是:什么是正确的地方-在公众,私有或受保护的部分?而且-这个选择有什么区别吗? 解决方案 在哪里做的正确选择-在该类的公共,私人或受保护的部分? 我会将它们放入 public 部分。 这是因为删除构造函数或赋值运算符与使它们成为 private / 受保护的;并且在不删除它们的情况下,它们默 ..
发布时间:2020-05-31 23:52:23 C/C++开发

通过函数打开流

我需要帮助 [io](f)流的不可复制性质。 我需要为 fstream 提供一个hackish包装,以便处理在Windows上的文件名中带有unicode字符的文件。为此,我设计了一个包装器函数: bool open_ifstream(istream& stream,const string& filename) { #ifdef __GLIBCXX__ FILE * res ..
发布时间:2016-11-06 03:31:37 C/C++开发

任何函数都可以被删除的函数?

工作草案明确调用 defaulted-functions 必须是特殊成员函数(例如,copy-constructor,default-constructor等,§8.4.2.1-1)。 但是,我没有在 deleted-functions (§8.4.3)中看到任何这样的限制。是这样吗? 或者换句话说,这三个例子有效 c ++ 0 ? struct Foo { // 1 ..
发布时间:2016-10-24 13:29:22 C/C++开发

任何函数都可以被删除的函数?

工作草案明确调用 defaulted-functions 必须是特殊成员函数(例如,copy-constructor,default-constructor等,§8.4.2.1-1)。 但是,我没有在 deleted-functions (§8.4.3)中看到任何这样的限制。是这样吗? 或者换句话说,这三个例子有效 c ++ 0 ? struct Foo { // 1 ..
发布时间:2016-10-24 13:12:12 C/C++开发

有一个类是可复制但不可移动的任何用例?

阅读此最新问题 by @Mehrdad,其中类应该是不可移动,因此不可复制,我开始怀疑是否有一个类可以复制但不移动。从技术上讲,这是可能的: struct S { S(){} S(S const& s){} S(S&&)= delete; }; S foo() { S s1; S s2(s1); // OK(可复制) return s1; //错误! (不 ..

默认移动构造函数/赋值和删除拷贝构造函数/赋值

根据标准, 如果类X的定义没有显式声明一个移动构造函数,作为默认值(如果且仅当 ) - X没有用户声明的复制构造函数, 没有用户声明的复制赋值运算符, - X没有用户声明的移动赋值运算符, - X没有用户声明的析构函数。 b $ b #include class Foo { public: Foo()= default; ..
发布时间:2016-10-20 21:43:22 C/C++开发

如何“=默认”不同于“{}”为默认构造函数和析构函数?

我最初发布这个问题只是关于析构函数,但现在我添加了默认构造函数的考虑。这是原来的问题: 如果我想给我的类一个析构函数是虚拟的,但是 否则相同编译器会生成什么,我可以使用 = default : Widget { public: virtual〜Widget()= default; }; 但是似乎我可以得到相同的效果与更少的打字使用 空定义: cla ..