C++ 是否';自动';c+中指针的类型赋值+;11要求'*';?
假设我的变量是指针,如果我将其分配给“auto”类型的变量,是否指定“*”C++ 是否';自动';c+中指针的类型赋值+;11要求'*';?,c++,pointers,c++11,auto,C++,Pointers,C++11,Auto,假设我的变量是指针,如果我将其分配给“auto”类型的变量,是否指定“*” std::vector*getVector()//返回填充向量 //... std::vector*myvector=getVector()//假设其中有n项 auto newvar1=myvector; //vs: auto*newvar2=myvector; //目标是表现得像此任务: std::vector*newvar3=getVector(); 我对这个auto如何在c++11中工作有点困惑(这是c++11的
std::vector*getVector()//返回填充向量
//...
std::vector*myvector=getVector()//假设其中有n项
auto newvar1=myvector;
//vs:
auto*newvar2=myvector;
//目标是表现得像此任务:
std::vector*newvar3=getVector();
我对这个auto
如何在c++11中工作有点困惑(这是c++11的一个新特性,对吧?)
更新:我对上述内容进行了修改,以更好地阐明向量在函数中的实际填充方式,我只是尝试将返回的指针指定给变量。很抱歉给你带来了混乱
auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;
这两者都是相同的,将声明一个指向std::vector
(指向随机位置,因为在您的示例中myvector
未初始化,可能包含垃圾)的指针。所以基本上你可以使用它们中的任何一个。我更喜欢auto-var=getVector()
,但如果您认为它更强调意图(即var
是一个指针),您可以选择auto*var=getVector()
我必须说,我从未梦想过使用auto
时会出现类似的不确定性。我认为人们只会使用auto
,而不会去想它,这在99%的情况下是正确的-用一些东西装饰auto
的需要只需要参考和简历限定符
但是,当进行轻微修改时,两者之间存在细微差异:
auto newvar1 = myvector, newvar2 = something;
在本例中,newvar2
将是一个指针(必须是指针)
这里,newvar2
是指针对象类型,例如std::vector
,初始值设定项必须足够
通常,如果初始值设定项不是带括号的初始值设定项列表,编译器将按如下方式处理auto
:
auto
替换为模板参数。所以对于auto*x=…
,它使用
template <class T> void foo(T*);
模板void foo(T*);
foo(初始值设定项)
,并查看T
的推断结果。这将被替换回auto
T
对于所有这些参数都必须相同auto&newvar1=*myvector
或使用auto newvar1=myvector创建指向同一向量的另一个指针代码>。与其他尝试的差异auto*newvar1=myvector
是后者一次强制myvector为指针类型,因此以下代码失败:
std::vector<int> v1;
auto* v2 = v1; // error: unable to deduce ‘auto*’ from ‘v1’
std::vector v1;
自动*v2=v1;//错误:无法从“v1”推断“auto*”
在常量方面,auto
和auto*
之间可能存在细微的区别
int i;
const auto* p = &i;
相当于
int i;
const int* p = &i;
int i;
int* const p = &i;
鉴于
int i;
const auto p = &i;
相当于
int i;
const int* p = &i;
int i;
int* const p = &i;
这具有以下效果:
无效测试(int a){
常数自动*p1=&a;
*p1=7;//错误
p1=nullptr;//确定
常量自动p2=&a;
*p2=7;//确定
p2=nullptr;//错误
}
目标没有意义;这个任务不会在C++中编译。<代码> AutoPyTr>代码>现在已经被禁止了。我应该澄清我正在创建(堆)并在函数中填充向量,然后返回指向该向量的指针,并且想要创建一个变量来存储指针。我编辑了我的问题来详细说明。我修改了我的问题,以澄清我正在寻找一个指向填充向量的指针来分配给这个变量。你能检查一下你的答案是否仍然适用于这两个语法是相同的吗?谢谢@ildjarn的经验证据似乎与你不一致。我在Clang3.4和GCC4.8.3上得到了相同的结果。此外,它遵循模板类型推断:如果主模板推断出T=int*
,那么指针的专门化将推断出T=int
。对于auto*p=&i
推导出的int
类型随后通过auto*
的指针声明器部分“增强”,生成与auto p=&i
@boycy中相同的类型:你是对的,我不知道我在想什么(我猜是引用和cv限定符)。感谢您的发言,删除了否决票。:-]关于如何避免不复制的任何建议(注意:我的问题已被修改,以澄清我想做什么——很抱歉之前不清楚),如前所述,请使用auto&newvar1=*myvector;这不复制。OP不“想要”任何东西。const auto p=&i
相当于int*const
,而不是const int*const
。在您的示例中,可以执行*p2=7代码>。因此,使用const auto*const p
计算总常数?const auto p=&i*p=3,谁不会上当。“安全地生活在东海岸”的另一个原因是()auto-const p=&i
显然意味着int*const p
,如果要保持指针的恒定性,auto-const*p
会自动跟随。
int i;
int* const p = &i;