2015-04-06 49 views
3

對於Visual C++ 2003到2013年編譯時存在此錯誤。它在針對g ++ 4.9.2編譯時不存在。這個函數爲什麼會進入範圍?

#include <ios> 

int main() { 
    left(*(new std::string)); 

    return 0; 
} 

問題是它會報告一些關於參數的錯誤。我期望的結果是它會說「標識符未找到」,因爲std :: left()應該超出範圍!複製內聯函數的

實施例:

STD_BEGIN 
inline std::ios_base& __CLRCALL_OR_CDECL left2(std::ios_base& _Iosbase) { 
    _Iosbase.setf(std::ios_base::left, std::ios_base::adjustfield); 
    return (_Iosbase); 
} 
_STD_END 

我檢查IOS,發現它是一個內聯函數。我將它複製出來,使用相同的宏將其粘貼到std名稱空間中,併爲其指定一個新名稱。但是新功能超出了範圍?

那麼爲什麼std :: left()和std :: right()在這裏的範圍?

回答

4

依賴於參數的查找將考慮名稱空間中的函數重載,如果一個或多個參數的類型也在該名稱空間中。在這種情況下,參數類型爲std::string,因此在查找過載時會考慮namespace std,並且找到std::left

順便說一句,從不在真實代碼中寫*new;它幾乎總是會導致內存泄漏。

+0

這只是一個例子。 – Zhro 2015-04-06 10:55:19

相關問題