【问题标题】:Why don't C++03 file streams accept string constructor parameters?为什么 C++03 文件流不接受字符串构造函数参数?
【发布时间】:2012-02-27 22:18:11
【问题描述】:

为什么下面的代码在C++11 中编译而在C++03 中却没有? gcccl

#include <string>
#include <iostream>
#include <fstream>

int main(int argc, char* argv[]) {
    const std::string t("Hello");
    std::ofstream out(t);
}

为什么C++03 流不接受std::string 作为构造函数参数? 这个决定是基于某事还是偶然发生的?

【问题讨论】:

    标签: c++ c++11 fstream c++03 library-design


    【解决方案1】:

    使用严格符合 C++03 的编译器编译代码时会失败,因为采用 std::string 的构造函数仅在 C++11 中添加。

    至于“是不是基于智能的东西”这个问题,由于接口被添加,可以推断它没有技术原因被省略。

    这是一个额外的便利,因为如果你有一个std::string,你可以随时调用.c_str() 来获得一个适用于旧接口的 C 字符串。 (正如 C++11 中的文档所说,采用 std::string 的构造函数与调用采用 const char* 的相应构造函数的效果相同,结果调用 .c_str() on字符串。)

    【讨论】:

      【解决方案2】:

      我记得,几年前在 clc++.m 上讨论过这个问题,Andrew Koenig(无论如何我认为是 Andrew)说它实际上是在一些会议上提出的,但是接受string 的想法很快就与接受wstring 的想法混为一谈,从那里变成了关于支持文件名中的国际化字符集的讨论,并且......不久之后整个想法就是掉落是因为它打开了一大罐蠕虫,当时没人准备好对付它。

      【讨论】:

        【解决方案3】:

        他们只是忘记了在 C++03 中添加 string 构造函数。现在已经解决了。这一次忘记了其他事情,比如make_unique。总有更多的事情可以做。 C++03 也忘记为函数模板指定默认参数,现在包含在内。

        编辑: 正如@Charles 所说,它可能不是字面上的“忘记”,而是显然应该在那里,但只是没有由于某种原因被指定。 std::next/std::prev 给出了进一步的例子,这让我感到很欣慰,std::to_stringstd::stoi/d/ul/ull 也很有意义,但是直到这次,没有人能够指定它们。他们之前的缺席不一定有很深的原因。

        【讨论】:

        • 我不确定“被遗忘”是否真的合适。 Iostreams 是标准库中最古老的部分之一,第一个标准是对现有实践的大量编纂。正如 C++ 所涉及的那样,std::string 接口感觉更像是一种遗漏,尤其是在将 C++ 作为一种新语言进行教学时。它们帮助 iostream 形成整个库中更加一致的部分。
        猜你喜欢
        • 2011-01-03
        • 2022-12-11
        • 2011-10-27
        • 2017-02-20
        • 1970-01-01
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多