【问题标题】:C++ Incorrect behavior of std::string initializationC++ std::string 初始化的不正确行为
【发布时间】:2016-05-15 02:36:14
【问题描述】:

为什么下面的代码会编译?它可以使用 clang 编译并运行良好,并打印 first. 但是,我认为正确的行为应该是抱怨并发出适当的错误。

#include <iostream>
#include <string>

int main()
{
    std::string s{ "first", "second" };
    std::cout << s << std::endl;
}

这个问题的灵感来自this

【问题讨论】:

  • 这是因为“第一个”字符串在它的末尾有一个隐含的“\0”......告诉string对象停止寻找更多的字符(即使它可能仍在将“第二”的全部内存分配给)
  • @DarthRubik:不。这不是正在发生的事情。
  • 根本问题和this question一样。

标签: c++ string stl


【解决方案1】:

std::string 有一个带有两个迭代器的模板构造函数。当您传递字符串文字时,它们将衰减为 char const*,它有资格作为迭代器。但是,由于这些指针不构成有效范围,因此您有未定义的行为。

【讨论】:

  • @EissaN。不,这是您代码中的错误。您的程序表现出未定义的行为,因此 clang 没有义务做任何特别的事情,并且就 C++ 标准而言,可以做任何事情。
【解决方案2】:

这是未定义的行为。

这是调用std::string 的构造函数,它接受两个迭代器,开始和结束迭代器值。因为两个初始化参数具有相同的类型,所以它们被解释为一对迭代器,并匹配这个特定的重载构造函数。

字符指针的值被解释为开始/结束迭代器值。它恰好适用于 clang,但使用 gcc 会引发异常。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2012-12-20
    • 1970-01-01
    • 2014-04-26
    • 2016-02-04
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多