24
考慮this question,大約是下面的代碼編譯沒有:運營商是否應該被宣佈爲非成員非模板的朋友
std::vector<int> a, b;
std::cout << (std::ref(a) < std::ref(b));
它不會編譯,因爲vector
矢量comparison operators爲非成員函數模板和隱式轉換不允許考慮。但是,如果經營者,而不是寫成非成員非模板,friend
功能:
template <class T, class Allocator = std::allocator<T>>
class vector {
// ...
friend bool operator<(const vector& lhs, const vector& rhs) {
// impl details
}
};
那麼這個版本的operator<
會被發現ADL和被選爲最佳可行的過載,和原來的例子將編譯。鑑於此,是否有理由寧願我們目前擁有的非成員函數模板,還是應該將其視爲標準中的缺陷?
'operator <<'和流在幾個地方也有類似的問題:這會帶來一些問題。我可以寫一個'template operator <<(std :: basic_ostream &,std :: basic_string &)'* without *,這取決於不止一個前向聲明(任一個)。 「Koenig運營商」至少需要其中一個(哪個?),是否需要兩者? (這是正切的,因爲它是關於兩個類型的操作符,而不是像上面那樣) –
Yakk
我不明白爲什麼你會寫'std :: ref(a)
Columbo
@Columbo它適用於'int's。此外,我不知道爲什麼你會做很多東西 - 並不意味着語言不允許。另外,這可以讓你的類使用'operator std :: string()'來比較'string's比較的東西。 – Barry