在 c++11 中,指针的"auto"类型赋值是否需要"*"?



如果我的变量是指针,如果我将其分配给"auto"类型的变量,我会指定"*"吗?

std::vector<MyClass> *getVector(); //returns populated vector
//...
std::vector<MyClass> *myvector = getVector();  //assume has n items in it
auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;
//goal is to behave like this assignment:
std::vector<MyClass> *newvar3 = getVector();

我有点困惑这个auto是如何在c++11中工作的(这是c++11的一个新功能,对吧?)

更新:我修改了上面的内容,以更好地阐明如何在函数中真正填充向量,我只是试图将返回的指针分配给一个变量。抱歉造成的混乱

auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;

这两个都是相同的,并且将声明一个指向std::vector<MyClass>

的指针(指向随机位置,因为myvector在您的示例中未初始化,并且可能包含垃圾)。所以基本上你可以使用它们中的任何一个。我更喜欢auto var = getVector(),但如果你认为auto* var = getVector()更强调意图(var是一个指针),你可以选择它。

我必须说,我从未想过使用auto会出现类似的不确定性。我认为人们只会使用auto而不去想它,这在99%的情况下都是正确的——需要用一些只有参考和简历限定符的东西来装饰auto

然而,当稍微修改时,两者之间有的细微差异:

auto newvar1 = myvector, newvar2 = something;

在这种情况下,newvar2将是一个指针(某些东西也必须是)。

auto *newvar1 = myvector, newvar2 = something;

这里,newvar2是指针类型,例如std::vector<MyClass>,初始化器必须足够。

一般来说,如果初始值设定项不是一个支持的初始值设定值列表,编译器处理auto如下:

  1. 它生成一个人工函数模板声明,其中一个参数的形式与声明符的形式完全相同,auto被模板参数替换。所以对于auto* x = ...,它使用

    template <class T> void foo(T*);
    
  2. 它试图解析调用foo(initializer),并查看为T推导出的内容。这被替换回auto

  3. 如果一个声明中有更多的声明符,则对所有声明都执行此操作。推导出的CCD_ 19对于所有这些都必须是相同的。。。

当谈到常量时,autoauto*之间可能有细微的差异。

int i;
const auto* p = &i;

相当于

int i;
const int* p = &i;

int i;
const auto p = &i;

相当于

int i;
int* const p = &i;

这具有以下效果:

void test(int a) {
const auto* p1 = &a;
*p1 = 7;               // Error
p1 = nullptr;          // OK
const auto p2 = &a;
*p2 = 7;               // OK
p2 = nullptr;          // Error
}
auto newvar1 = *myvector;

这可能就是您想要的,它会创建实际向量的副本。如果要使用引用,请编写auto& newvar1 = *myvector;或创建指向同一矢量的另一个指针,请使用auto newvar1 = myvector;。与您的另一次尝试auto *newvar1 = myvector;的不同之处在于,后者曾强制myvector为指针类型,因此以下代码失败:

std::vector<int> v1;
auto* v2 = v1; // error: unable to deduce ‘auto*’ from ‘v1’

最新更新