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

pep*_*epr 7 compatibility visual-c++ visual-studio-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());
Run Code Online (Sandbox Code Playgroud)

编译器现在抱怨

error C2248: 'std::bad_alloc::bad_alloc' : cannot access private member declared 
    in class 'std::bad_alloc'
Run Code Online (Sandbox Code Playgroud)

......这是真的.那个版本的构造函数现在是私有的.

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

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

谢谢,彼得

era*_*ran 14

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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:既然我已经看过VS2012的代码了,也很清楚为什么提到的构造函数是私有的,而不是被完全删除:在类中似乎只有一个构造函数的使用bad_array_new_length.因此在bad_alloc中bad_array_new_length声明为a friend,因此可以使用该私有构造函数.如果bad_array_new_length只是将消息存储在所使用的指针中what(),则可以避免这种依赖性,但无论如何它都不是很多代码.