首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++0x中auto和decltype的区别

c++0x中auto和decltype的区别
EN

Stack Overflow用户
提问于 2012-06-07 23:21:57
回答 1查看 607关注 0票数 15

我在自动和解密方面遇到了麻烦。

代码语言:javascript
复制
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;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-07 23:30:27

不同之处在于:

代码语言:javascript
复制
  new auto(a[i]*b[i]);

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

代码语言:javascript
复制
  new decltype(a[i]*b[i]);

分配相同类型的对象,但没有初始值设定项。该对象是默认初始化的。

基本上,decltype(...)被视为一个类型,而auto指定了一个从初始化器推导出来的类型。

C++11样式

因为只有在特殊情况下才应该使用new,如果出于某种原因需要这些语义,它们应该正确地写成这样:

代码语言:javascript
复制
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])>();

此外,如果一个人习惯于普遍使用C++11统一初始化,如果一个人停止使用圆括号进行初始化,那么最终与decltype一起使用的圆括号在程序员看来不再像一个初始化器。

出于这个和其他原因,我认为一个“现代”的C++11风格应该包含一条规则,即应该始终使用大括号,并且永远不要使用括号进行初始化。(应该避免使用括号以外无法调用的构造函数,例如std::vector<int>(int,int);;不要创建新的构造函数,也不要使用旧的构造函数。)

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10934807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档