2017-02-27 26 views
0

我一直認爲auto應該用下面的形式auto varName = someOtherVar;。今天我發現我也可以使用auto varName(someOtherVar);。起初,我認爲這可能是工作中的參數根據查找。但我不確定。使用這種自動語法有什麼限制?下面是一些代碼:這是什麼使用汽車? - ADL?

#include <iostream> 
#include <string> 
#include <vector> 

class Person { 
    public: 
    Person(std::string s) : name(s) {} 
    Person(const Person& p) : name(p.name) {} 
    std::string name; 
}; 

int main() 
{ 
    Person p("hello"); 
    auto p2(p); // equivalent to auto p2 = p; ? 
    std::cout << p2.name; 
} 

回答

2

auto可以代替與初始化聲明類型說明符的使用;那麼類型是從初始化器中推導出來的。

T a = b;叫做copy initialization,T a(b);叫做direct initialization,有細微差別。因此auto p2(p);Person p2(p);相同。由於初始化程序與正在初始化的對象具有相同的類型,因此在這種情況下,複製初始化和直接初始化是相同的。

「依賴於參數的查找」指的是解析函數名稱的範圍。但這是一個對象聲明,而不是函數調用。 (在線std::cout << p2.name;上有ADL,但是 - operator<<通過ADL解析到std::operator<<)。

+0

也不要忘記'新的汽車(p)'。 –

+2

@NicolBolas個人而言,我寧願忘記那些.. :) –