我注意到當使用Apple的clang-release(703.0.31)時,通過push_back
方法將[signed] int
推送到std::vector<unsigned int>
方法會引發關於隱式符號轉換的警告。考慮到警告標誌,我對此感到滿意,但感到驚訝的是用emplace_back
方法替換它並沒有產生警告。`push_back`與`emplace_back`簽署警告
我用godbolt測試了這個,而叮噹3.9.0表現出相同的行爲。在任何情況下,gcc 6.2都不會產生警告。由於隱式符號轉換診斷不是(AFAIK)所需的行爲,所以我會毫不猶豫地將其稱爲一個錯誤,但我很好奇,如果我忽略了一些解釋(或複雜化)展示行爲的邊界情況。
你的問題是什麼?這是爲什麼'push_back'時'emplace_back'不會產生警告?或者,爲什麼鏗鏘會首先發出警告? – Rakete1111
這就是爲什麼你通常不想使用進位語義。 Emplacement是關於顯式轉換的,這意味着*你承諾可以根據你的args和預期的結果構建元素。如果您有現有值,請使用插入,而不是放置。例如:'std :: vector time_to_missile_launch; time_to_missile_launch.emplace(15);' –
(缺少)警告的第二個原因是,使用push_back時,轉換髮生在呼叫站點,而使用emplace_back時,它發生在系統頭部內部,這通常會禁用警告。 –