我有一個代碼片段(假設):
#include <iostream>
struct Pirate {
void song_name() {
std::cout << "Bink's Sake\n";
}
Pirate& operator*(Pirate const& other) {
// do something
return *this;
}
};
int main() {
Pirate p1{} p2{};
p1.song_name(); // does this use qualified or unqualifed name lookup?
p1 * p2;
std::cout << 5;
std::cout << 'a';
}
p1 * p2是使用限定名稱查找還是非限定名稱查找或 ADL ?
std::cout << 5轉變為std::cout.operator<<(5);
std::cout << 'a'轉變為std::operator<<(std::cout, 'a');
成員函式是否需要 ADL 才能作業?上述兩個陳述句是否使用限定或非限定名稱查找或 ADL?
謝謝
uj5u.com熱心網友回復:
運算子查找非靜態成員函式,例如
std::cout.operator<<(5);
如果它們具有非成員變體,則還可以通過非限定查找和 ADL 實作非成員函式。所有這些共同構成了過載集。
為了使其正常作業,應該通過 ADL 找到非成員變體,即放置在它們為其多載運算子的類的命名空間內。例如,operator<<對于您自己的類的多載,您不能使用成員版本,因為第一個引數可能應該是從std::ostream. 然后,非成員變體上的 ADL 是使其在任何地方都能作業的唯一方法。
uj5u.com熱心網友回復:
如果名稱所屬的范圍使用范圍決議運算子( ) 或成員訪問運算子(或) 明確表示,則名稱是限定名稱。::.->
情況1
因此,當您寫道:
p1.song_name(); //here p1.song_name is a qualified name
在上面的陳述句中,p1.song_name是一個限定名稱,所以這里發生了限定查找。
案例2
接下來,當您寫道:
p1 * p2;
上面的陳述句等價于:
p1.operator*(p2);
由于您的類Pirate有一個多載的成員函式operator*,因此上述陳述句將使用該成員函式。上面的陳述句也使用了限定查找,因為我們使用了成員訪問運算子 .。
案例3
在這里,我們有宣告:
std::cout << 5;
上面的陳述句等價于:
std::cout.operator<<(5);
它使用合格的查找,因為它有成員訪問運算子.
案例4
下面我們來看一下宣告:
operator<<(std::cout, 'a');
這里使用了for的char多載。這使用ADL,因為在這種情況下,第一個引數具有型別別。所以編譯器也會在其中定義的命名空間中查找。因此,對于這個呼叫,編譯器也會在命名空間中查找并找到多載。operator<<ofstreamcoutstdchar
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/429321.html
下一篇:尋找下一個回文
