const成员返回为非const
const member returned as non-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()
为什么返回非const向量?
decltype(d.get())
是参考类型;参考类型不能被构成标记(尽管它们的基本对象类型可以是),因此is_const
将是错误的。
如果您测试了基础对象类型std::remove_reference<decltype(d.get())>::type
,则is_const
应该为true。
it 是 const
!
此处的错误是您要测试的方式。is_const
只是告诉您参考类型不是const
,这始终是正确的。
最好直接测试这些东西,例如通过尝试突变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>&
。
相关文章:
- 从函数返回const char*数组
- 在 const 函数中通过引用和指针返回之间的区别
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 如果我在 const 函数上使用指针,我可以返回什么?
- 将返回类型专用化为 void 或 const 左值引用
- 为什么 const 函数返回左值而不是右值?
- 为什么"std::set::erase(const key_type&)"返回"size_type"而不是"bool"?
- 用 decltype 和 auto 推导出 const(返回)类型
- 延长函数的寿命延长 由 const& 获取参数并由 const& 返回
- 如何将指向指针列表的私有指针作为 const 返回
- 我应该在简单的访问成员函数中使用 const 返回类型吗?
- 如何可能移动const返回的对象
- 在具有专用器的模板类上正确使用 const 返回值
- 为什么 std::max 通过 const 返回?
- 德尔福中C++“const”返回类型相当于什么
- g++编译器忽略const返回类型
- 我应该什么时候通过 T const& 返回?
- c++编译器可以对const返回值执行RVO吗?