与auto

时间:2017-08-22 20:16:35

标签: c++

使用auto进行隐式转换时出错。

使用int变量捕获v.size()的返回是可以的但是自动抱怨。 编译器错误确实告知它是因为转换范围缩小。但我想用内存来理解这是如何发生的以及为什么auto不允许它这样做而正常转换是正常的

#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:在函数'int main()'中:main.cpp:11:27:错误:缩小   转换'v.std :: vector :: size()'   'std :: vector :: size_type {aka long unsigned int}'到'int'里面   {} [-Wararrowing]

当评论该行时,它可以完美地运行

#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 个答案:

答案 0 :(得分:4)

这与auto无关。如果您使用

,您将收到相同的警告
int size = int{v.size()};

此处的问题是int{v.size()}正在使用支持初始化来初始化临时int支撑初始化中的缩小转换是导致诊断显示的原因。

请注意

int size_1 = v.size();

也是一个缩小的转换,它不是标准要求发出警告/错误的转换。