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

更新: 我修改了上面的内容,以更好地阐明我的向量在函数中是如何实际填充的,我只是试图将返回的指针分配给一个变量。抱歉给你添麻烦了

49227 次浏览
auto newvar1 = myvector;


// vs:
auto *newvar2 = myvector;

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

我必须说,我从来没有梦想过类似的不确定性使用 auto。我认为人们只会使用 auto而不会去想它,这在99% 的情况下是正确的——需要用一些只有引用和 cv 修饰符的东西来装饰 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. It tries to resolve the call foo(initializer), and looks what gets deduced for T. This gets substituted back in place of auto.

  3. If there are more declarators in a single declarations, this is done for all of them. The deduced T must be the same for all of them...

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’

当涉及到常量时,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
}