c++ - c++11 中指针的 'auto' 类型分配是否需要 '*' ?

标签 c++ pointers c++11 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 的一个新功能,对吧?)

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

最佳答案

auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

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

我必须说我从未想过使用 auto 会出现类似的不确定性.我以为人们只会使用 auto不去想它,这在 99% 的时间里都是正确的——需要装饰 auto with something 仅带有引用和 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所有这些都必须相同...

关于c++ - c++11 中指针的 'auto' 类型分配是否需要 '*' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773257/

相关文章:

c++ - 派生 vector : Perform operations

c - C中字符串上的指针

c++ - 类模板的 constexpr 运算符重载

c++ - MFC 组合框下拉/下拉列表 : displaying only one item

c++ - 这种情况的好的设计是什么?

c++ - 需要使用私有(private)继承的设计帮助

python - Python 中的伪指针功能

c - 如何保存 C 函数中读取的变量?

c++ - 我们如何使用 STL 容器有效地存储对象? (即根据字段的值进行搜索)

c++ - 在 boost transformed() 之后比较嵌套迭代器