为什么必须将实参强制转换为const ?
Why must an argument ever be cast to const?
我的理解是,参数声明中的const表示被声明的函数不会改变const值。那么,为什么这会对调用者传递的参数的一致性提出要求呢?
定义代码:void Func(const Foo**);
main()
{
Foo* fooPtr;
Func(&fooPtr);
}
Visual Studio 2012编译器输出:
> error C2664: 'Func' : cannot convert parameter 1 from 'Foo**' to 'const Foo**'
> Conversion loses qualifiers
但是下面的工作:
main()
{
Foo* fooPtr;
Func(const_cast<const Foo**>(&fooPtr));
}
背后的理论是什么?
如果允许转换,则可以使用它来规避const正确性:
const Foo const_foo;
void evil(const Foo** p) {
*p = &const_foo; // *p is 'const Foo*', so this assignment is allowed
}
int main() {
Foo* p;
evil(&p); // modifies p to point to const_foo
p->modify(); // BOOM! Modifying a constant object
}
可以转换为const Foo* const*
;它不允许您将Foo*
更改为指向其他任何东西,因此不能破坏常量正确性。这比使用一个不可靠的石膏,然后抱着最好的希望要好;虽然你应该问问自己,如果你不想改变它,为什么不简单地按值传递指针
当Func(&fooPtr)确实修改了fooPtr而保持*fooPtr不变时,应该有两个版本的Func(),一个是根据另一个定义的:
void Func(const Foo**);
void Func(Foo** fooHndl)
{
Func(const_cast<const Foo**>(fooHndl));
}
这允许用句柄(**)调用Func()来调用const对象或非const对象
相关文章:
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 'HMODULE LoadLibraryA(LPCSTR)':无法将参数 1 从 'const _Elem *' 转换为 'LPCSTR'
- 将函数参数"const char*"转换为"std::string_view"是
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 启用从"vector<const T>&"到"const vector&"的隐式转换<T>
- 将 const 转换为 const char* 无效,我该如何解决?使用 gcc7 时失败
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- C++ 无法从 const int* 转换为 const_iterator
- 为什么我的编译器在调用 const getter 函数时抛出"转换丢失(const)限定符"错误?
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- 无法从'const std::string [3]'转换为'std::string'
- 无法在返回中转换 const 对象
- Tensorflow Lite ARM64错误:无法转换‘const int8x8_t
- 一种体面的方式来转换const列表参考参数,然后传递到另一个函数
- Overloading STD :: Whow()无法转换const char*
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- 强制转换 const 指针以使用旧版 C 代码
- 使用地址解释强制转换const
- c++转换const引用传递
- c#可以强制转换const吗?