2012-03-21 13 views
6

在C++ 11的標題中,有三個用於在數字和字符串之間轉換的新函數。數字轉換

std::string std::to_string(unsigned long long); 
std::string std::to_string(long double); 
std::string std::to_string(long long); 

第一個問題 - 爲什麼只有3個功能?簡單的int或unsigned int等等呢?

第二個問題 - 爲什麼to_string不會在下面的代碼中拋出異常?

long double x = std::numeric_limits<long double>::quiet_NaN(); 
std::string i = std::to_string(x); 
long double c = std::stold(i); // i = "1.#QNAN" 

第三個問題 - 爲什麼c等於1.0?

+0

野生猜測,但可能只有那三個存在,因爲較小的整數和浮點類型可以很容易地轉換爲它們而不會丟失信息。 – Collin 2012-03-21 13:01:15

回答

5
  • 只要它產生描述的行爲,你的意願去做..

    所有固有的數值類型可以隱式轉換爲任何unsigned long longlong doublelong long和仍持有所需的精度,因此不需要更多的過載。

    該標準規定應該定義以下函數,儘管符合標準的lib可以自由地執行「」,只要它產生與描述相同的行爲即可。


  • 它爲什麼要拋出一個異常?

    std::numeric_limits<long double>::quiet_NaN();是有效的值,並std::to_string (T)在標準中描述,得到相同的行爲調用sprintf與適當格式串

§21。5/6                   數值轉換

  • string to_string(int val);
  • string to_string(unsigned val);
  • string to_string(long val);
  • string to_string(unsigned long val);
  • string to_string(long long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);

    ...

返回:

  • 每個函數返回字符串對象保持將由 生成調用的sprintf(buf中,FMT,val)的用「%d」的格式指定符「的它的參數的值的字符 表示%U」, 「%LD」, 「%祿」, 「%LLD」, 「%LLU」, 「%F」, 「%F」,或「%Lf「,分別爲 ,其中buf指定了足夠大小的內部字符緩衝區。

  • 在什麼編譯器是c等於1.0

    轉換應產生一個NaN - 值如果i值(不包含任何位數)的NaN字符串表示。

    如果找不到合適的轉換函數被描述爲投入invalid_argument

    MSVC試圖std::numeric_limits<long double>::quiet_NaN();轉換爲std::string時將產生1.#QNAN

    當使用std::stold它會尋找第一個非空白字符,然後根據發現使用盡可能多的數字(在這種情況下,只有1),因此c將在函數調用後等於1.0

+0

visual studio 2010 – innochenti 2012-03-21 13:03:34

+0

i =「1.#QNAN」; – innochenti 2012-03-21 13:15:08

+0

@innochenti查看最新的答案。 – 2012-03-21 13:17:24

1

我覺得整個包在我的標準的副本:

string to_string(int val); 
string to_string(unsigned val); 
string to_string(long val); 
string to_string(unsigned long val); 
string to_string(long long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string(long double val); 

也許你的編譯器只是還沒有實現所有的人了嗎?

的功能被描述爲

返回:每個函數返回保持,將通過調用sprintf(buf, fmt, val)"%d"格式說明,"%u"來生成其自變量的值的字符表示一個字符串對象,"%ld""%lu","%lld","%llu","%f","%f""%Lf",其中buf指定足夠大小的內部字符緩衝器。

因爲它被認爲是一個包裝周圍sprintf它可能決定不拋出任何異常,爲sprintf沒有。

+0

我正在使用visual C++和msvc2010。 – innochenti 2012-03-21 13:01:20

+0

我相信附加功能在後期階段被添加到標準中,因爲像你這樣的人問他們。之前發佈了VC2010。 – 2012-03-21 13:34:21

+0

奇怪。我想知道他們爲什麼不包裝std :: ostringstream或std :: istringstream? – Robinson 2012-03-21 17:35:43