为什么创建静态const std :: string会导致异常?

拉胡尔·艾耶(Rahul Iyer):

我有字符串常量,用于我在应用程序中多个位置使用的字符串:

namespace Common{
    static const std::string mystring = "IamAwesum";
}

发布有关其他内容的问题(编译期间未包含在目标中的.h文件会发生什么情况?)时,另一位用户发表了以下评论:

请注意,在这种情况下,您的静态字符串是全局的。因此它们可以随时创建异常并且无法捕获。我建议您使用返回字符串引用的函数。std :: string const&mystring {静态std :: string const mystring =“ IamAwesum”; 通过这种方式返回mystring},只有在需要时才构造您的对象

有人可以解释为什么以我上面的方式使用静态const字符串会引发异常吗?

克尔扎格:

N4140§3.6.2 [basic.start.init] / 4

由实现定义,是否在的第一条语句之前对具有静态存储持续时间的非局部变量进行动态初始化main

N4140§N4140 15.3 [手柄除外] / 13

在具有静态存储持续时间的对象的析构函数中或在具有静态存储持续时间的命名空间范围对象的构造函数中引发的异常不会被on function-try-block捕获main()

您根本无法捕获由字符串的构造函数生成的异常-例如,std::bad_alloc

话虽如此,对于这么小的弦,我发现这种考虑是偏执的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: string :: compare(const char *)会抛出异常吗?

为什么String DataTemplate会导致堆栈溢出异常?

为什么即使删除后std :: string也会导致类中的内存泄漏

为什么返回vector <string>会抛出std :: bad_alloc异常?

将std :: string转换为具有负值的double会导致零或引发异常

用const char *初始化std :: string会导致乱码

为什么删除的移动语义会导致std :: vector问题?

为什么std :: equal_会导致动态分配?

为什么允许将 0 或 nullptr 分配给 std::string,即使它导致直接的运行时异常?

为什么std :: string_view比const char *快?

为什么std :: string的const访问器返回引用?

头文件中的静态const std :: string

为什么使用 std::stod 将 std::double 转换为 std::string 会出现异常?

从Java创建SQL函数会导致异常

为什么编译器更喜欢f(const void *)而不是f(const std :: string&)?

什么情况会导致.net 2.0 String构造函数引发异常?

为什么我不能从 std::string 迭代器创建 std::string_view ?

为什么抛出自身会导致异常?

为什么IDIV为-1会导致浮点异常?

为什么此属性会导致StackOverFlow异常?

为什么以不同顺序使用std :: remove_reference和std :: remove_const会产生不同的结果?

std :: string.assign(const char *)或op =(带有const char *)会创建char *的副本吗?

为什么我创建的自定义异常会导致非静态变量错误?

为什么使用std :: transform会导致exc_bad_access

为什么std :: get会导致变量抛出失败而不是未定义的行为?

为什么将std :: move(object)和该对象的成员传递给函数会导致SIGSEGV

为什么std :: hex会导致内存损坏vector.size()?

为什么std::visit in a unsatisfied concept会导致gcc编译错误

为什么将功能分配给std :: function会导致未定义的引用?