为了账号安全,请及时绑定邮箱和手机立即绑定

C ++ 11“自动”语义

C ++ 11“自动”语义

C++
素胚勾勒不出你 2019-12-27 09:37:12
当我使用C ++ 11时auto,关于类型归纳将解析为值还是引用的规则是什么?例如,有时很明显:auto i = v.begin(); // Copy, begin() returns an iterator by value这些不太清楚:const std::shared_ptr<Foo>& get_foo();auto p = get_foo(); // Copy or reference?static std::shared_ptr<Foo> s_foo;auto sp = s_foo; // Copy or reference?std::vector<std::shared_ptr<Foo>> c;for (auto foo: c) { // Copy for every loop iteration?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

规则很简单:这就是您声明的方式。


int i = 5;

auto a1 = i;    // value

auto & a2 = i;  // reference

下一个例子证明了这一点:


#include <typeinfo>

#include <iostream>    


template< typename T >

struct A

{

    static void foo(){ std::cout<< "value" << std::endl; }

};

template< typename T >

struct A< T&>

{

    static void foo(){ std::cout<< "reference" << std::endl; }

};


float& bar()

{

    static float t=5.5;

    return t;

}


int main()

{

    int i = 5;

    int &r = i;


    auto a1 = i;

    auto a2 = r;

    auto a3 = bar();


    A<decltype(i)>::foo();       // value

    A<decltype(r)>::foo();       // reference

    A<decltype(a1)>::foo();      // value

    A<decltype(a2)>::foo();      // value

    A<decltype(bar())>::foo();   // reference

    A<decltype(a3)>::foo();      // value

}

输出:


value

reference

value

value

reference

value


查看完整回答
反对 回复 2019-12-27
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

无论您从右侧(等于“ =”)获得什么,都永远不会成为参考。更具体地说,表达式的结果永远不会是引用。因此,请注意示例中结果之间的差异。


#include <typeinfo>

#include <iostream>


template< typename T >

struct A

{

    static void foo(){ std::cout<< "value" << std::endl; }

};


template< typename T >

struct A< T&>

{

    static void foo(){ std::cout<< "reference" << std::endl; }

};


float& bar()

{

    static float t=5.5;

    return t;

}


int main()

{

   auto a3 = bar();


   A<decltype(bar())>::foo(); // reference

   A<decltype(a3)>::foo();    // value

}


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 506 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信