C++ 将new与decltype一起使用 T*T//T是一个实现细节 t=新的t//要避免命名T以允许灵活性吗 t=新的decltype(*t)//错误:无法使用“新建”分配引用 t=新标准::删除\引用::类型()//笨重的

C++ 将new与decltype一起使用 T*T//T是一个实现细节 t=新的t//要避免命名T以允许灵活性吗 t=新的decltype(*t)//错误:无法使用“新建”分配引用 t=新标准::删除\引用::类型()//笨重的,c++,c++11,decltype,C++,C++11,Decltype,回答为什么decltype(*t)返回t&而不是t 我可以将最后一行放入宏中,但这似乎不太理想。 有没有比我目前拥有的更好的解决方案?这属于on吗?如果它们在同一行上,您可以使用auto仅命名T一次: T *t; //T is an implementation detail t = new T; //want to avoid naming T to allow for flexibility t = new decltype(*t); //error: cannot use 'new' to

回答为什么
decltype(*t)
返回
t&
而不是
t

我可以将最后一行放入宏中,但这似乎不太理想。
有没有比我目前拥有的更好的解决方案?这属于on吗?

如果它们在同一行上,您可以使用
auto
仅命名
T
一次:

T *t; //T is an implementation detail
t = new T; //want to avoid naming T to allow for flexibility
t = new decltype(*t); //error: cannot use 'new' to allocate a reference
t = new std::remove_reference<decltype(*t)>::type(); //clunky
否则,您可以创建一个小函数模板:

auto t = new T;
模板
无效do_新(T*&p){
p=新T;
}
//用法:
int main()
{
T*T;
do_new(t);
}
正如@MadScienceDreams指出的,您可以扩展它以允许非默认构造函数:

template <class T>
void do_new(T * &p) {
  p = new T;
}


// Usage:
int main()
{
  T *t;
  do_new(t);
}
模板
无效do_新(T*&p,参数和…参数){
p=新T(标准:正向(arg)…);
}
//用法:
int main()
{
T*T;
do_new(t);
std::string*s;
do_new(s,“Abc”);
}
std::remove\u pointer::type
更具表现力/清晰性


如果重复多次,或者会使某行变得过长/复杂,您也可以使用本地
typedef

+1,这当然属于SO。关于这是否属于代码审阅的问题属于Meta.)在C++11中,不应该使用原始指针。使用。也不要编写
new
,实现自己的(或使用GCC 4.9或最新的MSVC++等编译器)并使用它。避免命名
t
的常见方法是提供适当的
typedef
,可由库所有者进行调整。我看不出在任何地方隐藏类型的意义。。。再说一遍,我不相信几乎总是自动说教。实际上,孤立地说,
*t
是一个
t
:)你得到了一个左值,它不是一个参考
decltype
破坏了你的想法。我会继续做一个“do_new”变量模板,这样new就可以有参数了。@MadScienceDreams Done。我假设您指的是构造函数的参数,而不是分配函数的参数:-)
template <class T, class... Arg>
void do_new(T * &p, Arg &&... arg) {
  p = new T(std::forward<Arg>(arg)...);
}


// Usage:
int main()
{
  T *t;
  do_new(t);
  std::string *s;
  do_new(s, "Abc");
}