根据运营商新的参考条目(http://www.cplusplus.com/reference/std/new/operator%20new/):
全局动态存储操作员功能在标准库中是特殊的:
- operator new的所有三个版本都在全局命名空间中声明,而不是在std命名空间中声明.
- 第一个和第二个版本在C++程序的每个翻译单元中隐式声明:不需要包含标题以使它们存在.
在我看来,这意味着在C++程序的每个翻译单元中都没有隐式声明第三版operator new(placement new),<new>并且需要包含标题才能使它存在.那是对的吗?
如果是这样,如何使用g ++和MS VC++ Express编译器,我似乎可以#include <new>在我的源代码中使用第三版new编译代码?
另外,关于operator new的MSDN标准C++库参考条目为包含该#include <new>语句的三种形式的operator new提供了一些示例代码,但是如果没有这个包含,该示例似乎对我来说编译和运行相同?
// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass( )
{
cout << "Construction MyClass." << this << endl;
};
~MyClass( )
{
imember = 0; cout << "Destructing MyClass." << this << endl;
};
int imember;
};
int main( )
{
// The first form of new …Run Code Online (Sandbox Code Playgroud) 从/sf/answers/1863048911/可以看出,标准保证以下标题#include <initializer_list>:
<utility><string><algorithm><random><valarray><regex>这些头文件中的大多数都声明了至少一个带std::initializer_list<E>参数的函数,所以它是有意义的.然而,
<array>,<stack>并且<queue>没有这样的功能,尽管在这里统一处理所有容器也许是有意义的.<utility> 没有这样的功能.<iterator>确实有一个带initializer_list参数(rbegin,rend)的函数,但它没有指定包含<initializer_list>.这些例外背后的理由是什么?
最终的C++ 11标准包括基于范围的规定,以便为原生数组"正常工作",而不必包含<iterator>任何其他标题.据我所知,由于英国78和79的评论,在工作文件n2900中首先解决了这个问题.
该提案还包括隐含#include <initializer_list>在每个翻译单元中的条款,以便例如该程序
#include <iostream>
int main()
{
for (auto i : { 1, 2, 3, 4, 5 })
std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)
即使没有包括,也会符合标准<initializer_list>.
但是,当从C++ 11中删除概念时,基于范围的修订版被修改为如n2930所示.虽然数组"正常工作"的规定仍然存在,但没有提到初始化列表也是如此; 事实上,各种标准库容器标题的规范#include <initializer_list>和8.5.4.2的最终文本意味着与我相反.
据我所知,这与该主题的最终措辞非常接近.那么,关于最终标准的程序是否完善,或者我是否需要#include <initializer_list>在基于范围的基础上使用它?换句话说,在基于范围的情况下使用初始化列表是否构成了" std::initializer_list根据FDIS的8.5.4.2 使用---甚至是未命名类型的隐式用法"?