80

鉴于我的变量是一个指针,如果我将它分配给“自动”类型的变量,我是否指定“*”?

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 的一个新特性,对吧?)

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

4

3 回答 3

73
auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

这两个是相同的,并且将声明一个指向std::vector<MyClass> (指向随机位置,因为myvector在您的示例中未初始化并且可能包含垃圾). 所以基本上你可以使用其中任何一个。我更喜欢auto var = getVector(),但auto* var = getVector()如果您认为它更好地强调意图(即var指针),您可能会选择。

我必须说我从未梦想过使用auto. 我认为人们只会使用auto而不考虑它,这在 99% 的情况下都是正确的 -auto用某些东西来装饰的需要仅来自引用和 cv 限定符。

但是,稍微修改一下,两者还是有细微差别的

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. 如果单个声明中有更多声明符,则对所有声明符都这样做。推导的T必须对所有这些都相同...

于 2012-10-07T22:13:33.930 回答
45

当涉及到 constness 时auto,可能存在微妙的差异。auto*

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
}
于 2019-10-08T08:57:55.027 回答
2
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’
于 2012-10-07T23:31:17.110 回答