鉴于我的变量是一个指针,如果我将它分配给“自动”类型的变量,我是否指定“*”?
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
像这样:
它生成一个人工函数模板声明,其中一个参数与声明符的确切形式相同,
auto
替换为模板参数。所以对于auto* x = ...
,它使用template <class T> void foo(T*);
它试图解决调用
foo(initializer)
, 并查看T
的推导结果.这被替换为auto
.如果单个声明中有多个声明符,则对所有声明符都这样做。推导出
T
所有这些都必须相同...
关于c++ - c++11 中指针的 'auto' 类型分配是否需要 '*' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773257/