在重載解析期間,函數對象是否與常規函數處理方式不同?如果是這樣,怎麼樣?函數對象如何影響重載分辨率?
我所遇到以下情況下具有等效可調用的功能對象替換的函數改變了代碼的含義是:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
template <typename... Args>
void bar(Args&&... args) { std::cout << "global bar\n"; }
int main()
{
bar(N::A);
}
這裏的輸出是「N ::欄」。到目前爲止,這麼好:N :: bar被ADL發現,N :: bar和全局條都是精確匹配,並且N :: bar是首選,因爲它不是模板。
但是,如果我改變了全球的酒吧是一個函數對象,就像這樣:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
struct S
{
template <typename... Args>
void operator()(Args&&... args) { std::cout << "global bar\n"; }
};
S bar;
int main()
{
bar(N::A);
}
現在的輸出是「全球性吧」。爲什麼區別?
今天我學到了,謝謝大衛。 – ildjarn
我不認爲3.4的音符。1/3是相關的,因爲'bar' *是函數調用表達式中的後綴表達式(沒有函數作爲操作數,但最終調用一個!)。注意3.4.2沒有改變「x(y)」的語法含義 - 如果它是一個函數調用,它會保留一個函數調用,而不考慮3.4.2決定做什麼。 –
@ JohannesSchaub-litb:定期查找會發現'bar'是一個對象,並且作爲一個對象'bar(x)'代表'operator()'應用於該實例。雖然運算符的應用程序是函數調用,但它是*成員函數*調用,因此ADL不適用。 –