我在自动和解密方面遇到了麻烦。
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之间的区别。
发布于 2012-06-07 23:30:27
不同之处在于:
new auto(a[i]*b[i]);分配一个a[i]*b[i]类型的对象,并用该值初始化该对象。也就是说,括号是一个初始化器。而使用decltype:
new decltype(a[i]*b[i]);分配相同类型的对象,但没有初始值设定项。该对象是默认初始化的。
基本上,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])>();此外,如果一个人习惯于普遍使用C++11统一初始化,如果一个人停止使用圆括号进行初始化,那么最终与decltype一起使用的圆括号在程序员看来不再像一个初始化器。
出于这个和其他原因,我认为一个“现代”的C++11风格应该包含一条规则,即应该始终使用大括号,并且永远不要使用括号进行初始化。(应该避免使用括号以外无法调用的构造函数,例如std::vector<int>(int,int);;不要创建新的构造函数,也不要使用旧的构造函数。)
https://stackoverflow.com/questions/10934807
复制相似问题