2017-08-22 36 views
0

爲隱式轉換獲取使用自動錯誤。當與自動一起使用時出現錯誤窄轉換

使用int變量捕獲返回的v.size()可以,但自動投訴。 編譯器錯誤,不告知這是因爲縮小轉換的。但我想在內存方面要了解這是如何發生以及爲什麼汽車是不是允許它這樣做,而正常轉換是因爲以下行確定

#include <iostream> 
#include <vector> 
int main() 
{ 
    auto v = std::vector<int>{ 1, 2, 3 }; 

    auto c = 'h'; 
    auto n2 = int{c}; 
    std::cout<<n2<<" "<<c; 

    auto size = int{v.size()}; 
    std::cout<<size; 

    int size_1 = v.size(); 
    std::cout<<size_1; 

} 

錯誤 auto size = int {v.size()};

main.cpp: In function 'int main()': main.cpp:11:27: error: narrowing conversion of 'v.std::vector::size()' from 'std::vector::size_type {aka long unsigned int}' to 'int' inside { } [-Wnarrowing]

當該行被註釋掉它完美

#include <iostream> 
#include <vector> 
int main() 
{ 
    auto v = std::vector<int>{ 1, 2, 3 }; 

    auto c = 'h'; 
    auto n2 = int{c}; 
    std::cout<<n2<<" "<<c; 

    //auto size = int{v.size()}; 
    //std::cout<<size; 

    int size_1 = v.size(); 
    std::cout<<size_1; 

} 

輸出

104 h3 

DEMO LINK

+1

有什麼難以理解的?你正在將'long unsigned int'轉換爲'int' - 可能會截斷它。這很糟*你應該很高興你的友好編譯器警告你。 –

+1

「使用int變量捕獲v.size()的返回是可以的」 - 不,它是* not *。 'size()'不*返回'int'。有轉換髮生,結果可能不是你所期望的。加強的初始化(和編譯器警告)可以讓你避免在這裏犯錯。 –

回答

4

這有什麼好做auto。如果你使用

int size = int{v.size()}; 

這裏的問題是int{v.size()}使用支撐初始化初始化臨時int你會得到同樣的警告。 支持的初始化中的縮小轉換是導致診斷顯示的原因。


請注意,

int size_1 = v.size(); 

又是一個收縮轉換,它只是沒有一個地方,一個警告/錯誤發出的標準規定。

+0

auto n2 = int {c};沒有發現任何錯誤? –

+1

@HariomSingh'c'是一個'char',它的要求是sizeof(int)> = sizeof(char)',所以沒有縮小。 – NathanOliver

+0

也許補充說,如果沒有拉緊的初始化,截斷仍然會發生 - 它只是默默接受(儘管如此,它並不能使它正確)。 –

相關問題