簡體   English   中英

`push_back`與`emplace_back`符號警告

[英]`push_back` vs. `emplace_back` sign warning

我注意到使用Apple的clang版本(703.0.31)時,通過push_back方法將[signed] int推入std::vector<unsigned int>會引發有關隱式符號轉換的警告。 給定警告標志,對此我感到滿意,但感到驚訝的是,將其替換為emplace_back方法不會產生警告。

我使用godbolt進行了測試,而clang 3.9.0表現出相同的行為。 無論哪種情況, gcc 6.2均不會產生警告。

由於不是必需的隱式符號轉換診斷(AFAIK)行為,因此我會毫不猶豫地將其稱為錯誤,但是我很好奇是否忽略了一些可以解釋(或使之復雜!)所表現出的行為的極端情況。

就像這之間的區別:

signed a = 0;
unsigned b = a;

和這個:

unsigned b = unsigned(a);

后者是阻止此類警告發生的一種典型方法(另一種方法是強制轉換)。

調用emplace_back()時,它是完全相同的-該方法的重點是從給定值構造一個value_type (在您的情況下為unsigned)。

同樣,如果您有:

struct Foo { explicit Foo(int x) {} };

然后,您可以執行以下操作:

std::vector<Foo> v;
v.emplace_back(1);

但這不是:

v.push_back(1);

總之, emplace_back()的含義不是“ push_back(),而是更有效”。 相反,它是“在容器內部使用這些參數構造value_type”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM