2014-01-23 87 views
0

在下面的简单的例子const成员返回作为非const

#include <vector> 
#include <type_traits> 
#include <typeinfo> 
#include <iostream> 

class Dumb { 
    public: 
     typedef const std::vector<double> result_type; 
    private: 
     result_type mat_; 
    public: 
     Dumb(const result_type& mat) : mat_(mat) {} 
     const result_type& get() const { 
      std::cout << "const return" << std::endl; 
      return mat_; 
     } 
     result_type& get() { 
      std::cout << "non-const return" << std::endl; 
      return mat_; 
     } 
}; 


int main(int,char*[]){ 
    const std::vector<double> B(5,1.0); 
    const Dumb d(B); 
    d.get(); 
    std::cout << "d " << typeid(d).name() << " " 
      << std::is_const<decltype(d)>::value << std::endl; 
    std::cout << "d.get() " << typeid(d.get()).name() << " " 
      << std::is_const<decltype(d.get())>::value << std::endl; 
} 

其产生输出

const return 
d N12_GLOBAL__N_14DumbE 1 
d.get() NSt3__16vectorIdNS_9allocatorIdEEEE 0 

例如

const return 
double (anonymous namespace)::Dumb 1 
d.get() std::__1::vector<double, std::__1::allocator<double> > 0 

为什么d.get()返回一个非常量向量?

回答

1

const

这里的错误是你正在测试的方式。 is_const只是告诉你,参考类型不是const,它总是如此。

最好直接测试这些东西,例如by trying to mutate the result of d.get()

#include <vector> 
#include <iostream> 

class Dumb 
{ 
    public: 
     typedef const std::vector<double> result_type; 
    private: 
     result_type mat_; 
    public: 
     Dumb(const result_type& mat) : mat_(mat) {} 
     const result_type& get() const { return mat_; } 
     result_type& get() { return mat_; } 
}; 

int main(int, char*[]) 
{ 
    const std::vector<double> B(5,1.0); 
    const Dumb d(B); 
    d.get().push_back(6); 
} 

// error: 
// no matching function for call to 'std::vector<double>::push_back(int) const' 

由此看来,很明显,d.get()const std::vector<double>&

3

decltype(d.get())是参考类型;引用类型不能是const限定的(虽然它们的基础对象类型可以),所以is_const将是错误的。

如果测试基础对象类型std::remove_reference<decltype(d.get())>::type,则is_const应为true。

相关问题