相关疑难解决方法(0)

const_cast安全吗?

我找不到太多的信息const_cast.我能找到的唯一信息(在Stack Overflow上)是:

const_cast<>()用于添加/删除变量的常量(岬)(或挥发性岬).

这让我很紧张.可能const_cast会导致意外行为?如果是这样,什么?

或者,什么时候可以使用const_cast

c++ casting const-cast

88
推荐指数
6
解决办法
5万
查看次数

允许从 std::map 的键中窃取资源吗?

在 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)

c++ move-semantics

15
推荐指数
1
解决办法
804
查看次数

是否允许在const定义的对象上抛弃const,只要它实际上没有被修改?

是否允许以下​​内容:

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,只要对象是不实际修改,如在实施例?

c++ const const-cast undefined-behavior

12
推荐指数
1
解决办法
349
查看次数

为什么WSAStringToAddress采用非const AddressString?

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*参数吗?


下面是更后面的故事的......我试图用WSAStringToAddressinet_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)

parameters winapi const winsock2

6
推荐指数
1
解决办法
136
查看次数

为什么禁止将 `int**const` 强制转换为 `const int**const`

允许以下情况:

    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)

在我的理解中,pp1const-ptr to ptr to int”应转换为“const-ptr to ptr to const-int”。因此我添加const,所以我认为这是允许的。

c++ casting const-cast

2
推荐指数
1
解决办法
96
查看次数