當我在寫關於基本運算符重載一些代碼。我來到這個代碼片段,ISO C++說,這些都是不明確的,操作符重載
struct MyInt {
public:
MyInt() : data() { };
MyInt(int val) : data(val) { }
MyInt& operator++() {
++data;
return (*this);
}
MyInt operator++(int) {
MyInt copy = *this;
++data;
return copy;
}
MyInt& operator+=(const MyInt& rhs) {
data += rhs.data;
return *this;
}
MyInt operator+(const MyInt& rhs) const {
MyInt copy = *this;
copy += rhs;
return copy;
}
int data;
};
這些都是正常,直到我的類
MyInt operator+(const MyInt& lhs, const MyInt& rhs)
{
MyInt copy = lhs;
copy.data += rhs.data;
return copy;
}
的聲明之後加入這個權利有了這個主declartion
int main() {
MyInt mi = 10;
MyInt mi2 = 11;
MyInt mi3 = mi++ + ++mi2;
mi3 += mi2;
}
當我嘗試編制,G ++我
warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
MyInt mi3 = mi++ + ++mi2;
^
note: candidate 1: MyInt operator+(const MyInt&, const MyInt&)
MyInt operator+(const MyInt& lhs, const MyInt& rhs)
^
note: candidate 2: MyInt MyInt::operator+(const MyInt&) const
MyInt operator+(const MyInt& rhs) const {
拋出此警告
從我見過的其他問題來看,它們都是錯誤而不是警告。所以我不確定爲什麼它的代碼仍然有效。希望有人能向我解釋爲什麼會發生這種情況。
在此先感謝。
@Drop這是什麼UB? 'MyInt mi3 = mi ++ + ++ mi2;'是三個不同的變量,所以沒有UB。 – NathanOliver
這裏沒有真正的問題。 「他們爲什麼不明確?」 「爲什麼g ++將此作爲警告並仍然創建二進制文件?」 –
@NathanOliver我認爲這是因爲左邊的後綴意味着'const&'被轉換爲一個臨時值......但這似乎排除了lhs + rhs定義是一個合格的重載,所以我'我不確定除了「ISO是這麼說的」之外,還有什麼是「模棱兩可的」。 [另外,我上面的評論回覆了一個現在被刪除的評論,稱這是一個值得采訪的UB例子] –