为什么C ++ 03文件流不接受字符串构造函数参数?

时间:2012-02-27 22:18:11

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

为什么以下代码在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作为构造函数参数? 这个决定是基于某些事情还是偶然发生的?

3 个答案:

答案 0 :(得分:9)

使用严格符合C ++ 03的编译器编译时代码失败,因为只有std::string的构造函数才被添加到C ++ 11中。

至于问题,“它是基于智能的东西”,因为添加了 接口,可以推断出没有技术理由可以省略它。

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

编辑:正如@Charles所说,它可能不是字面意思“忘记”,而是明确应该存在的东西,但是没有由于某种原因而被指定。进一步的例子由std::next / std::prev提供,这是一个很大的缓解,而std::to_stringstd::stoi/d/ul/ull,这又是完全合理的,但没有人知道如何指定它们直到这一轮。他们之前缺席的原因并不一定。