我只是想使用 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(使用前将#替换为@)