c ++ 0x中auto和decltype之间的区别

Leo*_*all 15 c++ decltype auto c++11

我遇到auto和decltype问题.

void f(const vector<int>& a, vector<float>& b)
{
    typedef decltype(a[0]*b[0]) Tmp;
    for (int i=0; i < b.size(); ++i) {
      auto p0 = new auto(a[i]*b[i]);
      auto p1 = new decltype(a[i]*b[i]);
      *p0=a[i]*b[i];
      *p1=a[i]*b[i];
      cout<<*p0<<endl;
      cout<<*p1<<endl;
      delete p0;
      delete p1;
   }
}

 int main()
{

    vector<float>vec2;
    vec2.push_back(2.0);

    vector<int>vec1;
    vec1.push_back(5);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在GCC4.7中运行良好.我可以使用'new auto(a [0]*b [0])'为[0]*b [0]的类型分配内存吗?在这种情况下,我无法区分decltype和auto之间的区别.

bam*_*s53 19

不同之处在于:

  new auto(a[i]*b[i]);
Run Code Online (Sandbox Code Playgroud)

分配任何类型的对象a[i]*b[i],并使用该值初始化对象.也就是说,括号是初始化器.而使用decltype:

  new decltype(a[i]*b[i]);
Run Code Online (Sandbox Code Playgroud)

分配相同类型的对象,但没有初始化程序.该对象默认初始化.

基本上decltype(...)被视为类型,同时auto指定从初始化器推导出的类型.


C++ 11风格

既然new不应该使用除非在特殊情况下,如果由于某种原因需要这些语义,他们应该正确写成如下:

template<typename T, typename... Args> T make_unique(Args &&...args) {
  return std::unique_ptr<T>{std::forward<Args>(args)...};
}

template<typename T> T make_unique_auto(T &&t) {
    return std::unique_ptr<T>{std::forward<T>(t)};
}

// new auto(a[i]*b[i])
auto p1 = make_unique_auto(a[i]*b[i]);

// new decltype(a[i]*b[i])
auto p2 = make_unique<decltype(a[i]*b[i])>();
Run Code Online (Sandbox Code Playgroud)

此外,如果一个人习惯于普遍使用C++ 11统一初始化,并且如果停止使用括号进行初始化,那么最终使用的括号将decltype停止向程序员看起来像初始化程序.

出于这个原因和其他原因,我认为"现代"C++ 11样式包含一个规则应该总是使用大括号并且从不使用括号进行初始化.(除了括号之外不能调用的构造函数,例如std::vector<int>(int,int);,应该避免;不要创建新的,不要使用遗留的.)

  • 换句话说,第一个与`new decltype(a [i]*b [i])(a [i]*b [i]);`相同. (11认同)
  • 我突然在里面哭了一下.我希望*永远不要*看到这一点. (4认同)