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(),则可以避免这种依赖性,但无论如何它都不是很多代码.
| 归档时间: |
|
| 查看次数: |
2787 次 |
| 最近记录: |