Ste*_*ock 3 c++ pointers const-cast
众所周知,应避免使用const_cast来删除指针的常量.
但是另一种方式呢?
对于我的用例,我有一个从非const源缓冲区复制数据(字节)的函数.我认为一个好的设计决定是根据源缓冲区完全const来声明参数.
void copyfunction(const char* const data) { ... }
Run Code Online (Sandbox Code Playgroud)
对于像下面这样的函数调用,这将导致指针类型错误'const char*const < - > char*'.
void main() {
char sourcebuffer[] = {0x00};
copyfunction(sourcebuffer);
}
Run Code Online (Sandbox Code Playgroud)
当然,现在我可以简单地声明sourcebuffer为const,但在我的情况下,我无法访问该变量,因为它来自不同的代码位置(外部库).
void main() {
char sourcebuffer[] = {0x00};
copyfunction(const_cast<const char* const>(sourcebuffer));
}
Run Code Online (Sandbox Code Playgroud)
然而,超出的代码可以工作,但它是好的风格(根据我的用例)?
我认为声明copyfunctionas const 的参数可以确保用户不修改(只读)指针或源缓冲区本身的位置.所以在这种情况下,const_cast只是启用函数调用的必要之恶,而不是故意删除指针的常量......
电贺
您不应该使用const_cast添加const,因为:
这是不必要的.T*隐式转换为const T*.你的问题表明这char sourcebuffer[] = {0x00}; copyfunction(sourcebuffer);是一个错误,但事实并非如此.
它可能(虽然不太可能)有害.它可以volatile从指针类型中删除,这不是这里的意图,如果sourcebuffer声明为,将导致未定义的行为volatile sourcebuffer[].
你不应该使用const_cast添加const因为
在操作安全的情况下,几乎总是不需要. int*变成const int*隐含的.
它可以做一些你不希望它做的事情.它可以剥离volatile,或者让你错过const在变量中的其他地方添加的事实,你const_cast现在默默地剥离它们.
在需要添加的情况下const,其使用是危险的,难以推理.
在某些情况下,您需要调用const_cast以便添加const不会隐式发生的情况.
void assign_ptr( int const*& lhs, int const* rhs ) { lhs = rhs; }
int const foo = 7;
int* bar = nullptr;
assign_ptr( const_cast<int const*&>(bar), &foo );
*bar = 2; // undefined behavior!
std::cout << foo << "@" << &foo << "\n"; // will print probably 7@something
std::cout << *bar << "@" << bar << "\n"; // will print probably 2@same address as above!
Run Code Online (Sandbox Code Playgroud)
以上调用assign_ptr仅添加const,但不会隐式发生.
它的副作用是修改*bar是未定义的行为,因为它修改了一个声明的变量const(它使bara int*,指向fooa const int).
因此,虽然const_cast需要进行assign_ptr调用编译,但这是因为它不安全.该const_cast不会使它更安全,它只是隐藏的错误.
这是矩形平方问题的特定情况.正方形不是矩形,因为如果更改正方形的宽度,其高度也会发生变化,修改矩形时不会发生这种情况.同样,int**不是int const**.(注意,不可变的Square是一种不可变的Rectangle;它是导致问题的突变.在指针的情况下,a int*const*是a int const*const*:"更高级别"指针的可变性导致问题.)
| 归档时间: |
|
| 查看次数: |
2052 次 |
| 最近记录: |