C++的假设是"你用的是什么,你付出的代价".然而,由于例外情况及其在STL中的普遍使用,这可能会非常虚弱.
在任何人说"只是打开异常"之前,生活对于我们必须生活的编程环境并不那么慷慨.我的是内核编程,其中执行环境没有提供足够的C++运行时来展开堆栈等.
当STL容器无法为其底层后备存储重新分配存储时,它们将抛出分配失败异常.当在环境中没有启用异常时,程序将会相当神秘地崩溃:我已经看到实现直接中止或只是假设分配工作即使它没有.
我遇到的许多C ADT库都是通过返回错误代码或将错误作为输出参数来提前解决此问题.
处理这个问题的"最佳"C++方法是什么?
我不想使用标准库,我不能.我不是在问"我怎么做那些无法做到的事情".我问:"考虑到一个干净的平板,如何建造容器库."
标准允许在整数类型,a enum和a 之间进行选择std::bitset.
在给定这些选择的情况下,为什么库实现者会使用其中一个?
例如,llvm的libcxx似乎使用了这些实现选项中的两个(至少)两个的组合:
ctype_base::mask 使用整数类型实现:
<__locale>
regex_constants::syntax_option_type使用enum+重载运算符实现:
<regex>
gcc项目的libstdc ++使用全部三个:
ios_base::fmtflags 使用枚举+重载运算符实现: <bits/ios_base.h>
regex_constants::syntax_option_type使用整数类型
regex_constants::match_flag_type实现,使用std::bitset
Both 实现:<bits/regex_constants.h>
AFAIK,gdb无法"检测"这三个选项中的任何一个的位域,因此增强调试没有区别.
该enum解决方案和整数类型的解决方案应该总是使用相同的空间.std::bitset似乎没有保证,sizeof(std::bitset<32>) == std::uint32_t所以我没有看到什么是特别吸引人的std::bitset.
该enum解决方案似乎略显不足类型安全的,因为口罩的组合不会产生一个枚举.
严格地说,前面提到的是n3376而不是FDIS(因为我无法访问FDIS).
在这方面的任何可用的启示将不胜感激.
以下代码使用修改的析构函数i.当析构函数运行时,2应该存储到我们观察到的返回i时.thing()-1
#include <stdio.h>
class Destruct {
int &i;
public:
Destruct(int &_i) : i(_i) {}
~Destruct() {
i = 2;
}
};
int thing() {
int i = -1;
Destruct d(i);
return i;
}
int main() {
printf("i: %d\n", thing());
}
Run Code Online (Sandbox Code Playgroud)