如何在断言中'force' const 访问器的使用?
How can I 'force' the use of the const accessor in the assert?
我的google fu不允许我找到任何关于这方面的信息,所以我在这里询问
我已经通过cppcheck运行了我的c++代码,它报告说assert
调用中的一些代码可能有潜在的副作用。我以较小的规模复制了这个问题:
struct Obj
{
int* myInt;
Obj() : myInt( new int(3) ) {}
~Obj() { delete myInt; }
const int* getInt() const { return myInt; }
};
struct C
{
Obj* myObj;
C() : myObj( new Obj() ) {}
~C() { delete myObj; }
const Obj* getObj() const { std::cout << "const" ; return myObj; }
Obj* getObj() { std::cout << "non const" ; return myObj; }
};
int main()
{
C c;
assert( c.getObj()->getInt() ); // Outputs "non const"
return 0;
}
(Coliru代码(
cppcheck是对的,这里:使用的getObj()
方法不是const
方法,而是非常量方法。
目标是1(满足cppcheck,2(确保这些断言中没有副作用。
我如何告诉编译器使用const
版本而不是非常量getter?
我有一种方法可以实现这一点,但我发现它非常不干净,我宁愿在这种情况下使用更传统的方法:const_cast
基本对象。
assert( const_cast<const C&>(c).getObj()->getInt() );
由于c不是常量:
C c;
c.getObj();
执行非常量版本。在C++17中有一个std::as_const()
,您可以使用它:
assert( std::as_const(c).getObj()->getInt() );
这比你建议的略好:
assert( const_cast<const C&>(c).getObj()->getInt() );
如果c++17不可用,您可以实现自己的as_const,并在断言语句:
template <class T>
const T & as_const(T& obj)
{
return obj;
}
template <class T>
void as_const(const T&& obj) = delete;
并使用它:
assert(::as_const(c).getObj()->getInt() );
必须添加::前缀,以避免由于std命名空间中对象的ADL而与std::as_const产生歧义。
相关文章:
- 如何在类中安全地访问 const 共享数组
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 从 const 对象访问非 const 方法
- 如何在断言中'force' const 访问器的使用?
- 通过 constexpr 中的 'const char *' glvalue 访问字符串文字的值会出错
- 访问函数中 const char *arr[] 的元素
- 如何访问一系列const变量作为const数组
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 在函数中使用 const 引用参数访问函数中成员的最佳实践 C++.
- 向 const 字符串参数发送 0 int 文本时的访问冲突
- 如何使用特征访问编译时const值
- 通过const成员变量访问内联函数
- 创建一个 const unique_ptr然后尝试从它 std::move 会给出与您尝试访问复制构造函数相同的错误
- 渲染循环无法访问 Assimp const 场景变量
- 您如何访问 const char **& in C++ 中的数据?
- 如何打印 /访问const void指针的内容
- 跨公共/受保护访问的基于const的函数重载
- 我应该在简单的访问成员函数中使用 const 返回类型吗?
- c/c++中访问const变量的速度
- 如何访问const引用形参的值