如果我的变量是指针,如果我将其分配给"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
如下:
它生成一个人工函数模板声明,其中一个参数的形式与声明符的形式完全相同,
auto
被模板参数替换。所以对于auto* x = ...
,它使用template <class T> void foo(T*);
它试图解析调用
foo(initializer)
,并查看为T
推导出的内容。这被替换回auto
。如果一个声明中有更多的声明符,则对所有声明都执行此操作。推导出的CCD_ 19对于所有这些都必须是相同的。。。
当谈到常量时,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
}
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’