2012-01-21 116 views
3
#include <iostream> 
#include <boost/shared_ptr.hpp> 

using namespace std; 

class A 
{ 

    public: 
     const shared_ptr<const int> getField() const 
     { 
      return field_; 
     } 

    private: 
     shared_ptr<int> field_; 
}; 

void f(const A& a) 
{ 
    auto v = a.getField(); //why auto doesn't a const shared_ptr<const int> here ? 
    v.reset(); //OK: no compile error 
} 

int main() 
{ 
    A a; 
    f(a); 
    std::cin.ignore(); 
} 

在上面的代碼,爲什麼編譯器推斷v的類型shared_ptr<int>而不是由const shared_ptr<const int>返回getfield命令的類型?汽車和const對象

編輯: MSVC2010

+0

您使用的編譯器是什麼? –

+2

相關:http://stackoverflow.com/questions/7138588/c0x-auto-what-if-it-gets-a-constant-reference –

回答

7

auto忽略引用和頂級const秒。如果你希望他們回來,你必須這麼說:

const auto v = a.getField(); 

注意getField回報field_副本。你確定你不想要參考const嗎?

const shared_ptr<int>& getField() const; 

auto& v = a.getField(); 
+0

你爲什麼不寫:const的汽車&V = a.getField(); ? – Guillaume07

+0

因爲'const'在這種情況下是自動推斷的。 – fredoverflow

+0

好的......肯定C++是一種微妙的語言! – Guillaume07