我找不到太多的信息const_cast.我能找到的唯一信息(在Stack Overflow上)是:
将
const_cast<>()用于添加/删除变量的常量(岬)(或挥发性岬).
这让我很紧张.可能const_cast会导致意外行为?如果是这样,什么?
或者,什么时候可以使用const_cast?
在 C++ 中,是否可以从我以后不再需要的地图中窃取资源?更准确地说,假设我有一个std::mapwithstd::string键,我想通过map使用std::move. 请注意,对键的这种写访问会破坏 的内部数据结构(键的顺序),map但之后我不会使用它。
问题:我可以在没有任何问题的情况下执行此操作,还是会导致意外错误,例如在析构函数中出现意外错误,map因为我std::map以非预期的方式访问它?
这是一个示例程序:
#include<map>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
std::vector<std::pair<std::string,double>> v;
{ // new scope to make clear that m is not needed
// after the resources were stolen
std::map<std::string,double> m;
m["aLongString"]=1.0;
m["anotherLongString"]=2.0;
//
// now steal resources
for (auto &p : m) {
// according to my IDE, p has type
// std::pair<const …Run Code Online (Sandbox Code Playgroud) 是否允许以下内容:
const int const_array[] = { 42 };
int maybe_inc(bool write, int* array) {
if (write) array[0]++;
return array[0];
}
int main() {
return maybe_inc(false, const_cast<int *>(const_array));
}
Run Code Online (Sandbox Code Playgroud)
特别地,它是确定以铸远的常量性const_array,将其定义为const,只要对象是不实际修改,如在实施例?
WSAStringToAddress的Windows文档指出:
INT WSAAPI WSAStringToAddress(
_In_ LPTSTR AddressString,
_In_ INT AddressFamily,
_In_opt_ LPWSAPROTOCOL_INFO lpProtocolInfo,
_Out_ LPSOCKADDR lpAddress,
_Inout_ LPINT lpAddressLength
);
Run Code Online (Sandbox Code Playgroud)
AddressString一个_In_参数,而不是一个_Inout_参数.我不清楚为什么API采用非const指针,并导致编译失败,因为我有一个const char*.
我的第一个问题是,为什么WSAStringToAddress采用非常量指针?
我的第二个问题是,将常数抛弃是否安全?会WSAStringToAddress修改char*参数吗?
下面是更后面的故事的......我试图用WSAStringToAddress在inet_addr更换由于在Visual Studio中的当代版本弃用警告.
这是PetarKorponaić提供的答案问题中详述的相同问题.Korponaić遇到了同样的问题.它的额外副本的原因:
int inet_pton(int af, const char *src, void *dst)
{
struct sockaddr_storage ss;
int size = sizeof(ss);
char src_copy[INET6_ADDRSTRLEN+1];
ZeroMemory(&ss, sizeof(ss));
/* stupid non-const API */
strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
src_copy[INET6_ADDRSTRLEN] = …Run Code Online (Sandbox Code Playgroud) 允许以下情况:
int * const p1 = nullptr;
auto p2 = static_cast< const int * const >( p1 );
Run Code Online (Sandbox Code Playgroud)
在我的理解中p1,是一个"const-ptr to int",它被转换为一个
"const-ptr to const-int"。
为什么以下内容被禁止
int * * const pp1 = nullptr;
auto pp2 = static_cast< const int * * const >( pp1 );
Run Code Online (Sandbox Code Playgroud)
在我的理解中,pp1“ const-ptr to ptr to int”应转换为“const-ptr to ptr to const-int”。因此我添加const,所以我认为这是允许的。