2016-05-11 50 views
7

Według C++ Primer, operator strzałki C++ daje lwartość. Dodatkowo decltype wyrażenia, które daje lwartość, da typ odniesienia. Dlaczego więc następujący typ decyzyjny ma wartość , a nie, oznacza typ odwołania.C++ typ strzałki daje lwartość

struct MyStruct { 
    string name 
}; 
MyStruct s; 
s.name = "aname"; 
MyStruct* p = &s; 
decltype (p -> name) str = s.name; //type of str will be string and not &string although p -> name yields an lvalue 
+3

Zobacz http://en.cppreference.com/w/cpp/language/decltype. – Holt

Odpowiedz

5

Od decltype (który jest z § 7.1.6.2/4 [dcl.type.simple]):

Jeśli argument jest unparenthesized id wyrażenie lub dostępu członek unparenthesized klasa, następnie decltype daje rodzaj podmiotu o nazwie niniejszym ex presja.

p->name mieści się w powyższym przypadku, więc typ decltype(p->name) jest typu p->name który std::string nie std::string&.

Z drugiej strony, decltype((p->name)) jest std::string&, ponieważ (p->name) jest wyrażeniem lwartości.

9

Od cppreference

Jeśli argument jest unparenthesized id wyrażenie lub unparenthesized dostęp członkiem klasy, następnie decltype daje rodzaj podmiotu o nazwie tej wypowiedzi. Jeśli nie ma takiej encji lub jeśli argument nazywa zestaw przeciążonych funkcji, program jest źle sformułowany.

Jest to przypadek w twoim przykładzie, więc zwróci podstawowy typ elementu, który jest std::string.

Jeśli chcesz, możesz dodać nawiasy tak, że decltype skutkuje odniesienia:

//'str' is a std::string& 
decltype((p->name)) str = s.name;