为什么 bad_alloc(const char*) 在 Visual C++ 2012 中被设为私有?

2023-11-27

我只是想使用 Visual Studio 2012 候选版本 C++ 编译一个更大的项目。该项目现在使用VS2010编译。 (我只是贪图 C++11 的东西,所以我尝试了。:)

除了我自己可以解释的事情之外,该项目使用如下代码:

ostringstream ostr;
ostr << "The " __FUNCTION__ "() failed to malloc(" << i << ").";
throw bad_alloc(ostr.str().c_str());

编译器现在抱怨

error C2248: 'std::bad_alloc::bad_alloc' : cannot access private member declared 
    in class 'std::bad_alloc'

...这是事实。该版本的构造函数现在是私有的。

将该版本的构造函数设为私有的原因是什么? C++11 标准是否建议不要将该构造函数与参数一起使用?

(我可以想象,如果分配失败,尝试构建任何新的东西可能会导致更多问题。但这只是我的猜测。)

谢谢, 彼得


C++11 标准定义bad_alloc因此(18.6.2.1):

class bad_alloc : public exception {
public:
    bad_alloc() noexcept;
    bad_alloc(const bad_alloc&) noexcept;
    bad_alloc& operator=(const bad_alloc&) noexcept;
    virtual const char* what() const noexcept;
};

没有采用字符串的构造函数。提供此类构造函数的供应商将使使用它的代码不可移植,因为其他供应商没有义务提供它。

C++03 标准定义了一组类似的构造函数,因此即使在 C++11 之前,VS 也没有遵循这部分标准。 MS 确实尝试使 VS 尽可能符合标准,因此他们可能只是利用这个场合(新 VS、新标准)来修复不兼容性。

Edit:现在我已经看到了 VS2012 的代码,也很清楚为什么提到的构造函数被保留为私有,而不是被完全删除:该构造函数似乎只有一种用途,在bad_array_new_length班级。所以bad_array_new_length被宣布为friend在 bad_alloc 中,因此可以使用该私有构造函数。这种依赖性本来可以避免,如果bad_array_new_length只是将消息存储在所使用的指针中what(),但无论如何代码并不多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 bad_alloc(const char*) 在 Visual C++ 2012 中被设为私有? 的相关文章

随机推荐