2017-02-27 6 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 initializationT a(b);と呼ばれるものは、微妙な違いがあります。

従ってauto p2(p);Person p2(p);と同じです。イニシャライザは初期化されるオブジェクトと同じ型を持つので、この場合はコピー初期化と直接初期化は同じです。

「引数依存ルックアップ」は、関数名のスコープを解決することを指します。しかし、これはオブジェクト宣言であり、関数呼び出しではありません。 (std::cout << p2.name;にはADLがありますが、 - operator<<std::operator<<にADLで解決します)。

+0

また、 'new auto(p)'も忘れないでください。 –

+2

@NicolBolas個人的に私はむしろそれについて忘れるだろう.. :) –

関連する問題