【问题标题】:C++ and ambiguous treatment of string literals [duplicate]C ++和字符串文字的歧义处理[重复]
【发布时间】:2021-03-17 20:20:41
【问题描述】:

在我的 C++/Linux 应用程序中,我想创建一个临时文件夹。

代码很简单:

std::string tempFolder(mkdtemp("foo"));

令我惊讶的是,我收到了一条警告消息:

警告:ISO C++11 不允许从字符串文字转换为 'char *'

好吧,我记得 C++ 将字符串文字视为std::string,而不是char*。我也知道我可以通过将char * 声明为const char* 来避免此消息。所以我的代码可能如下所示:

const char *tpl = "foo";
std::string tempFolder(mkdtemp(tpl));

如果不是因为mkdtemp 需要char * 而不是const char*。所以这里需要显式转换,现在我的代码应该是这样的:

const char *tpl = "foo";
std::string tempFolder(mkdtemp(const_cast<char *>(tpl)));

在我看来,这看起来绝对荒谬,代码看起来绝对难以理解和超载。

所以我的问题 - 我做错了什么?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    mkdtemp(3) - Linux manual page 说:

    mkdtemp() 函数生成一个唯一命名的临时目录 从模板。模板的最后六个字符必须是 XXXXXX 并且这些被替换为使目录名称的字符串 独特。然后使用权限 0700 创建目录。因为 它将被修改,模板不能是字符串常量,但是 应该声明为字符数组。

    如您所见,不允许将字符串文字传递给mkdtemp(),您必须传递带有以XXXXXX 结尾的字符串的字符数组。

    char tpl[] = "fooXXXXXX";
    std::string tempFolder(mkdtemp(tpl));
    

    【讨论】:

      【解决方案2】:

      你的信念

      C++ 将字符串文字视为std::string,而不是char*

      错了。 C++ 中的字符串文字实际上是 constant 字符的数组,即"foo"const char[4]。数组衰减为指向其第一个元素的指针。所以指向这样一个字符串的指针必须是const char*

      mkdtemp()修改字符串,所以不能使用字符串字面量作为参数,必须使用非常量数组。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2013-03-15
      相关资源
      最近更新 更多