我試圖編寫一個模板函數,使用ADL解決get
來獲取結構/範圍的成員(tuple
-esque)。爲什麼ADL不解析爲正確的函數與std ::得到
#include <iostream>
#include <utility>
#include <tuple>
int main() {
auto tup = std::make_tuple(1, 2);
std::cout << get<0>(tup) << std::endl;
}
我做的原因是什麼結構化綁定提案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf§11.5.3)表示,有關如何get
被用來獲取的結構元素這一點。它表示非會員get
用於從結構中獲取元素。
我認爲上面的代碼將編譯,因爲ADL會導致std
命名空間來看待爲get
功能(因爲它的參數是std::tuple<int, int>
類型,這是在std
的),它會被發現。但是,我收到一個錯誤。有人可以在這裏解釋正確的方法,以及爲什麼上面的代碼不起作用?在這種情況下,如何迫使ADL發生?
非常有趣!我不知道,引入這個未定義的函數可能會導致其他問題嗎?像衝突之類的? – Curious
@Curious它會,如果它最終成爲首選。我的意思是,實際上不這樣做 - 我只是爲了解釋目的而放在那裏。 – Barry
嗯,有什麼辦法可以強迫ADL發生?我嘗試了'template'關鍵字,但當然不起作用。 – Curious