【问题标题】:Error Can not convert char** to const char** [duplicate]错误无法将 char** 转换为 const char** [重复]
【发布时间】:2022-01-10 13:52:15
【问题描述】:

我有以下代码:-

static char* ListOfStr[] = { "str1", "str2", "str3" };
void Foo(const char** listOfStr)
{
// do something
}

当我打电话给Foo 时;

Foo(ListOfStr);

我收到错误无法将 char** 转换为 const char** (C2664 - vc++)

我知道如何使用强制转换或其他方式解决问题,例如首先定义 const 数组。

但是使用 char** 作为 const char** 是否比它给出错误的原因更安全? 我想在传递给函数时应该有像std::stringconst std::string 这样的自动转换。只有 cont char**char** 的反面必须给出没有强制转换的错误。

【问题讨论】:

  • 这是因为在现代 C++ 中 "literal string"const char * 而不是 char *
  • @SamVarshavchik 错误信息似乎表明相反问题。
  • @anastaciu 这是一条非常红的鲱鱼,当然;-)
  • 您可以将Foo 声明为Foo(const char* const* listOfStr),这样可以避免重复中的陷阱,因为传递的指针不再是可变的,因此您不能使用它来将 const 换成非-const.

标签: c++ pointers visual-c++ const-correctness


【解决方案1】:

C++ 常见问题解答中涵盖了该问题,感谢 Steve Summit:https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion

我看了 10 分钟,仍然没有完全理解它,但问题显然是你可以创建非常量别名,从而在允许的情况下修改最初的 const 对象。

【讨论】:

  • 最后,如果每一步都是合法的,那么q会指向p,p会指向x,其中q和x是const,而不是p,这是一个问题。 q 主要用于使 p 指向 *q = &x; 内的 x(此时 *q 为 p)。因此,必须禁止一步。除中间那一行外,所有行都是常用的。我想如果我没有阅读您的链接,我永远不会猜到这条看似无害的线在一百年内实际上是危险的。
  • @Aziuth q 也不是 const ......它指向指向 const 的指针。
猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多