[英]Does 'auto' type assignments of a pointer in c++11 require '*'?
鑒於我的變量是一個指針,如果我將它分配給一個“自動”類型的變量,我是否指定了“*”?
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()
,但如果你認為它更好地強調意圖( var
是一個指針),你可以選擇auto* var = getVector()
。
我必須說我從來沒有想過使用auto
遇到類似的不確定性。 我認為人們只會使用auto
而不會考慮它,這在 99% 的情況下是正確的 - 需要用引用和 cv 限定符來裝飾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
。
如果單個聲明中有更多聲明符,則對所有聲明符都這樣做。 所有這些推導出的T
必須相同......
就常量而言, 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’
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.