![](/img/trans.png)
[英]g++ and clang++ different behaviour with recursive initialization of a static member
[英]g++ and clang++ different behaviour with stream input and unsigned integer
我發現gcc(4.9.2)和clang(3.5.0)之間的行為有所不同,令我感到驚訝。
當我嘗試從使用std::istringstream
初始化的std::istringstream
提供unsigned int
(在示例中為“-15”),我得到
fail()
位) signed(-15)
進行初始化 我准備了以下示例程序。
#include <sstream>
#include <iostream>
int main ()
{
std::istringstream iss("-15");
unsigned int ui;
iss >> ui;
std::cout << "ui[" << ui << "] signed(ui)[" << signed(ui)
<< "] flags[" << iss.fail() << iss.good() << iss.bad()
<< iss.eof() << "]\n";
return 0;
}
使用clang ++,我獲得以下輸出
ui[0] signed(ui)[0] flags[1001]
使用g ++,我獲得以下輸出
ui[4294967281] signed(ui)[-15] flags[0001]
我有兩個問題。
首先是顯而易見的:誰是對的? clang ++,g ++還是一個未定義的行為?
第二個是:我如何強制gcc ++的行為類似於clang ++,從一個以減號開頭的字符串中提取無符號值時會出錯?
謝謝,抱歉我的英語不好。
編輯2016.04.03
我意識到這不是g ++和clang ++之間的區別,而是libstd ++和libc ++之間的區別。
使用clang ++和libstd ++編譯和鏈接,我獲得了與g ++相同的輸出。
抱歉。
這在前面已經討論過: 負數字串(例如“-10”)到無符號短路
答案是根據C ++標准22.4.2.1.2p3,轉換需要失敗,值存儲應該是:
對於無符號整數類型 ,最負的可表示值或零 ,如果該字段表示的值太大而無法在val中表示。 ios_base :: failbit被分配給err。
因此,clang ++是正確的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.