相关疑难解决方法(0)

什么时候C++需要#include <new>库?

根据运营商新的参考条目(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)

c++ include standard-library new-operator

44
推荐指数
3
解决办法
3万
查看次数

为什么指定这些C++标头包含<initializer_list>?

/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++ initializer-list

15
推荐指数
1
解决办法
816
查看次数

#include <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 使用---甚至是未命名类型的隐式用法"?

c++ initializer-list c++11

11
推荐指数
1
解决办法
2835
查看次数