visual-c – 为什么bad_alloc(const char *)在Visual C 2012中变为私有?

前端之家收集整理的这篇文章主要介绍了visual-c – 为什么bad_alloc(const char *)在Visual C 2012中变为私有?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是尝试使用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()使用的指针中,则可以避免这种依赖性,但无论如何它都不是很多代码.

猜你在找的C&C++相关文章