簡體   English   中英

C ++如何隱式地將參數轉換為比較器,如<?

[英]How does C++ implicitly cast arguments to a comparator such as <?

我原以為這可以通過谷歌輕松解決問題,但我似乎無法找到明確的(甚至是推測性的)答案:

使用比較器語句時,隱式轉換的順序是什么?

int i = -1;
size_t t = 1;

bool result = i < t;

這相當於:

bool result = i < int(t);    // equals true

要么:

bool result = size_t(i) < t;    // equals false

這是問題的簡單部分 - 第二部分是“一般規則是什么”,因為它可能是:

  1. 'simpler'參數總是轉換為'更復雜'的參數(即size_t-> int),或
  2. 第一個(或第二個)參數始終轉換為第二個(或第一個)參數的類型,或
  3. 內置的原語(如size_t和ints)具有特定的比較運算符,用於逐個指定轉換。

所有三個看起來都是合理的,盡管第二個會產生與大多數人直觀期望的行為明顯不同的行為。

當你將int與size_t進行比較時,VC ++編譯器似乎認為它值得一個3級警告 - 然而當你從返回size_t的函數返回負數時它只給出4級警告(這導致一個數字只是超過返回的最大整數的一半)。

為了擺脫所有4級警告,我現在無論如何都明確地投了一切,但我想知道“真相”。 這必須在某處定義......

規則相當復雜,取決於實現。 但基本上:

  1. 兩種類型都被“提升”。 這意味着任何小於int東西都會被提升為int (在不太可能的情況下, size_t小於int ,它將被提升為signed int ,並且松散其無符號。)

  2. 如果其中一個類型可以包含另一個類型的所有值,則另一個類型將轉換為此類型。

  3. 如果其中一個類型是無符號的,另一個是有符號的,並且它們具有相同的大小,則signed將轉換為unsigned。

對於intsize_t (需要無符號),這意味着除非size_t小於int ,否則int將轉換為size_t

$ 18.2 / 6-類型size_t是一個實現定義的無符號整數類型,它足夠大,可以包含任何對象的字節大小。

$ 5.9 - 否則,如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩, 則帶有符號整數類型的操作數應轉換為具有無符號整數類型的操作數的類型。 對於第一部分,bool在C ++標准指定的轉換之前被提升為int。

因此,這意味着'i'被轉換為'size_t'的類型(假設size_t的類型為'unsigned int'或更高)。 然后將'unsigned int'類型的result轉換為'bool'(這是result的類型)。

注意,Standard指定signed intunsigned int的等級相同。

有關轉換/促銷的確切規則,請參閱C ++標准的第4節和第5節。

暫無
暫無

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

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