关于std::string移动构造与代码中noexcept合理性的问询
结论:给这个
foo函数加noexcept完全不合理 - 你搞错了核心问题:
p_str + "FOO"这个拼接操作本身就可能抛出异常。
拼接字符串时,std::string需要为结果分配新内存,一旦系统内存不足,这个分配会抛出std::bad_alloc。这一步发生在构造l_str之前,和移动构造是否抛异常没关系。 noexcept是对整个函数的承诺——你保证函数在任何执行路径下都不会抛出异常。但拼接操作的内存分配显然可能打破这个承诺,一旦异常抛出,程序会直接触发std::terminate强制终止,这是完全不合理的。- 顺带提一句:你对右值的理解是对的,
p_str + "FOO"的结果是右值,构造l_str时确实会调用不抛异常的移动构造,但这只覆盖了构造l_str的环节,前面的拼接步骤依然有抛异常的风险。
所以这个noexcept必须去掉。
内容的提问来源于stack exchange,提问作者casaDePapel
相关产品推荐
相关产品推荐

