我只是尝试使用Visual Studio 2012 Release Candidate,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标准定义了一组类似的构造函数,因此VS甚至在C 11之前也没有遵循标准的这一部分.MS确实试图使VS尽可能符合标准,因此他们可能只是使用了这个场合(new VS,新标准)来修复不兼容性.
编辑:既然我已经看过VS2012的代码,那么为什么提到的构造函数是私有的,而不是被完全删除也很清楚:在bad_array_new_length类中似乎只有一个构造函数的使用.所以bad_array_new_length在bad_alloc中被声明为朋友,因此可以使用该私有构造函数.如果bad_array_new_length只是将消息存储在what()使用的指针中,则可以避免这种依赖性,但无论如何它都不是很多代码.