Dol*_*cci 44 c++ pointers auto 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();
Run Code Online (Sandbox Code Playgroud)
我对auto
c ++ 11的工作方式有点困惑(这是c ++ 11的新功能,对吧?)
更新:我修改了上面的内容,以更好地阐明我的向量是如何在函数中填充的,我只是尝试将返回的指针赋给变量.对困惑感到抱歉
jpa*_*cek 46
auto newvar1 = myvector;
// vs:
auto *newvar2 = myvector;
Run Code Online (Sandbox Code Playgroud)
这两个都是相同的,并将声明一个指针 std::vector<MyClass>
(指向随机位置,因为.所以基本上你可以使用它们中的任何一个.我更喜欢myvector
在您的示例中未初始化并且可能包含垃圾)auto var = getVector()
,但你可以选择,auto* var = getVector()
如果你认为它var
更好地强调意图(这是一个指针).
我必须说我从未梦想过使用类似的不确定性auto
.我认为人们只会使用auto
而不是考虑它,这在99%的时间都是正确的 - auto
用东西装饰的需要只有引用和cv限定符.
然而,就是在两者之间细微的差别时略有修改:
auto newvar1 = myvector, newvar2 = something;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,newvar2
将是一个指针(也必须是一些东西).
auto *newvar1 = myvector, newvar2 = something;
Run Code Online (Sandbox Code Playgroud)
这里newvar2
是指针类型,例如.std::vector<MyClass>
,初始化程序必须足够.
通常,如果初始化程序不是支撑的初始化程序列表,则编译器处理auto
如下:
它生成一个人工函数模板声明,其中一个参数具有声明符的确切形式,auto
并由模板参数替换.因此auto* x = ...
,它使用
template <class T> void foo(T*);
Run Code Online (Sandbox Code Playgroud)它尝试解析调用foo(initializer)
,并查看推断出的内容T
.这取代了代替auto
.
如果单个声明中有更多声明符,则对所有声明都执行此操作.推导出T
的所有人都必须相同......
常量性之间auto
和auto*
常量性之间存在细微的差异。
int i;
const auto* p = &i;
Run Code Online (Sandbox Code Playgroud)
相当于
int i;
const int* p = &i;
Run Code Online (Sandbox Code Playgroud)
而
int i;
const auto p = &i;
Run Code Online (Sandbox Code Playgroud)
相当于
int i;
const int* const p = &i;
Run Code Online (Sandbox Code Playgroud)
这具有以下效果:
int i;
const auto* p = &i;
Run Code Online (Sandbox Code Playgroud)