簡體   English   中英

從int&和long上的算術運算得出的C ++ 11自動類型推導

[英]C++11 auto type deduction from arithmetic operation on int& and long

我一定誤會了auto c ++ 11和更高版本如何解析類型。 我有以下代碼:

void foo(int& x)
{
    ++x;
}

int main()
{
    int i = 2;
    int& ir = i;
    long L = 5;
    auto a = ir/L;
    foo(a);

    return 0;
}

這導致編譯器錯誤:

test.cpp: In function 'int main()':

test.cpp:12:10: error: invalid initialization of non-const reference
of type ‘int&’ from an rvalue of type ‘int’
     foo(a);
          ^

test.cpp:1:6: note:   initializing argument 1 of ‘void foo(int&)’
 void foo(int& x)
      ^~~

但是,將auto替換為intint a = ir/L; )可以很好地編譯並得到預期的結果(調用foo()之前a == 0之后調用a == 1 )。 在玩完代碼並看到各種錯誤消息之后,我認為auto被推導為long int& 定義函數void bar(int x)void bar(const int& x)導致錯誤消息: call of overloaded 'bar(long int&)' is ambiguous

來自評論的更正:

我不明白auto x = [int&]/[int]導致可以由非const ref傳遞的左值,而auto x = [int&]/[long]導致的右值不能。

ir/L的結果是long 對於算術運算符 ,當二進制運算符具有不同的類型時,產生的結果將是普通類型; intlong之間會很long

所以auto a = ir/L; 的類型, along 它不能傳遞給foo(int&)因為您不能將左值引用綁定到具有不同類型的非const。

另一方面,給定L的類型為int ,則對於auto a = ir/L; 的類型, aint ,那么一切都很好。

關於“錯誤的右值部分”,當您將一個long傳遞給foo(int&) ,首先編譯器將嘗試將其轉換為int ,這是一個臨時(即一個右值),並且不能綁定到左值引用非常量。

long可以隱式轉換為int ,而臨時變量可以綁定到const的左值引用,因此將long變量傳遞給bar(int x)bar(const int&)都很好。

順便說一句:當你寫int a = ir/L; long類型的結果隱式轉換為int 因此,您將獲得一個int然后將其傳遞給foo(int&)很好。

您使用過auto的事實並不重要。

由於論據提升的規則, along類型。

由於foo 通過引用獲取參數,因此編譯會失敗,因為int&無法綁定到long類型(即使它們的大小相同並且具有相同的補碼表示形式)。

暫無
暫無

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

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