C++ 是否';自动';c+中指针的类型赋值+;11要求'*';?

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的

假设我的变量是指针,如果我将其分配给“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的一个新特性,对吧?)

更新:我对上述内容进行了修改,以更好地阐明向量在函数中的实际填充方式,我只是尝试将返回的指针指定给变量。很抱歉给你带来了混乱

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;