2012-05-24 46 views
14

我有C++代碼03看起來像這樣:將std :: tr1導入std - 它合法嗎?它是否改善便攜性?

#include <boost/tr1/unordered_map.hpp> 
... 
std::tr1::unordered_map<std::string, int> mystuff; 
... 

我開始懷疑,如果/當我將代碼轉換爲C++ 11,這(我猜)沒有按」我以後會吃虧沒有std::tr1::unordered_map,而是有std::unordered_map。所以,我想出了下面的技巧:

namespace std 
{ 
    using namespace ::std::tr1; 
} 
... 
std::unordered_map<std::string, int> mystuff; // no tr1 now! 
... 

它是合法的(也許進口的東西到std是被禁止的)?它會讓它更容易移植到C++ 11代碼中嗎?

+1

我的編譯器(VS2010)仍然能夠理解'std :: tr1',即使現在所有東西都存在於'std'中。 – Benj

回答

16

您不應該觸摸std命名空間:即使它現在有效,它可能會在稍後(使用新版本的編譯器,在不同的編譯器等)導致嚴重的麻煩。

更新:行情從標準(C++ 2003,第17.4.3.1 「保留名稱」)(發現here):

這是一個C 不確定 ++程序添加聲明或定義,命名空間std或命名空間std內的命名空間,除非另有指定。程序可以將任何標準庫模板的模板特化添加到名稱空間標準。標準庫模板的這種專業化(完整或部分)會導致未定義的行爲,除非聲明依賴於用戶定義的外部鏈接類型,並且除非專業化符合原始模板的標準庫要求。 [重點礦山]

+1

我認爲唯一有趣的答案是那些由某些事實支持的答案 - 比如「標準對此的看法」。 – akappa

+0

@akappa - 看到更新 – Attila

+0

現在好多了(upvoted) – akappa

7
導入

東西進入::std被禁止的C++ 11 17.6.4.2.1:

一個C如果它增加了聲明或定義到命名空間std ++程序是未定義的行爲或除非另有說明,否則命名空間爲std

3

我認爲this question與你所詢問的非常相似。

特別是,我喜歡「使用autoconf檢測符號可用性,然後使用條件定義來爲給定名稱別名正確名稱空間」的答案。

1

只有在您證明無法以更清晰的方式支持特定庫時才應該嘗試這種可移植性,理想情況下應該將其與特定於特定環境的#ifdef結合使用。

tr1的要點是要將您的stdtr1中的東西隔離開來。

相關問題